Python 如何从字符串中提取小时并填充空字典?

Python 如何从字符串中提取小时并填充空字典?,python,datetime,Python,Datetime,我有一个列表(示例如下所示)。如何从list1[0]中提取小时数,并将其用作两个词典count\u by_hour和'comments\u by_hour'中的键?从我收到的回复中,我可以得到每小时的评论数,但是我如何得到每小时的评论总数呢? 下面是一些代码: count_by_hour={} 注释按小时={} 按小时计数将来自索引[0],而评论数(num\u评论)来自索引[1] 列表1=['8/16/2016 9:55',6],'11/22/2015 13:43',29],'5/2/2016

我有一个列表(示例如下所示)。如何从
list1[0]
中提取小时数,并将其用作两个词典
count\u by_hour
和'comments\u by_hour'中的键?从我收到的回复中,我可以得到每小时的评论数,但是我如何得到每小时的评论总数呢? 下面是一些代码:

count_by_hour={}
注释按小时={}
按小时计数将来自索引[0],而评论数(num\u评论)来自索引[1]
列表1=['8/16/2016 9:55',6],'11/22/2015 13:43',29],'5/2/2016 10:14',1],
['8/2/2016 14:20', 3], ['10/15/2015 16:38', 17], ['9/26/2015 23:23', 1],
['4/22/2016 12:24', 4], ['11/16/2015 9:22', 1], ['2/24/2016 17:57', 1], 
['6/4/2016 17:17', 2]]

因此,如果所有内容都采用相同的格式,则可以拆分字符串:

例如:

dict1 = {}

s = '8/16/2016 9:55'
p = s.split(" ") # -> ['8/16/2016', '9:55']

hour, mins = p[1].split(":") # -> ['9', '55']

dict1[hour] = # value

您可以将小时与诸如
r“^\d{1,2}/\d{1,2}/\d{4}\s(\d{1,2}):\d{2}$”
等匹配,然后使用匹配的组,或者您可以使用将日期和时间转换为python
datetime
,然后获取datetime的小时值。

3种方法:

第一种方式:

import re

dt = '8/16/2016 9:55'
date_regex = r'\d+\/\d+\/\d{4} (?P<hours>\d+)\:\d+'
match = re.match(date_regex, dt)
print(match.group('hours'))
第三条道路:

from datetime import datetime

res = datetime.strptime('8/16/2016 9:55', '%m/%d/%Y %H:%M')
print(res.time().hour)

如果所有的时间戳都是相同的格式,您可以像下面那样处理它

from time import strptime

dict1 = {}
list1 = [['8/16/2016 9:55', 6], ['11/22/2015 13:43', 29], ['5/2/2016 10:14', 1],
    ['8/2/2016 14:20', 3], ['10/15/2015 16:38', 17], ['9/26/2015 23:23', 1],
    ['4/22/2016 12:24', 4], ['11/16/2015 9:22', 1], ['2/24/2016 17:57', 1], 
    ['6/4/2016 17:17', 2]]

for item in list1:
    dt_obj = strptime(item[0], "%m/%d/%Y %H:%M")
    dict1[dt_obj.tm_hour] = item

以下是我的解决方案和相关评论

dict1=[]
列表1=['8/16/2016 9:55',6],'11/22/2015 13:43',29],'5/2/2016 10:14',1],
['8/2/2016 14:20', 3], ['10/15/2015 16:38', 17], ['9/26/2015 23:23', 1],
['4/22/2016 12:24', 4], ['11/16/2015 9:22', 1], ['2/24/2016 17:57', 1], 
['6/4/2016 17:17', 2]]
对于清单1中的每一项:
如果每个[0]。拆分(“:”)[0][2][==”:#拆分人:获取最后一个字符并检查是否>9

dict1.append(每个[0].split(“:”)[0][1:])#如果时间是Python理解是解决更多迭代问题的好方法。理解是惯用的Python,通常比编写Python循环更快(因为它们是用C优化和处理的)

此外,最常见的问题,如解析日期/时间,可以使用标准库中的内容来解决。这里我们想使用
time
模块中的
strtime
(参见上面的答案)

在这种情况下,我们可以使用
strtime
和字典压缩来创建字典

In [1]: list1 = [['8/16/2016 9:55', 6], ['11/22/2015 13:43', 29], ['5/2/2016 10:14', 1],
      : ['8/2/2016 14:20', 3], ['10/15/2015 16:38', 17], ['9/26/2015 23:23', 1],
      : ['4/22/2016 12:24', 4], ['11/16/2015 9:22', 1], ['2/24/2016 17:57', 1],
      : ['6/4/2016 17:17', 2]]

In [2]: from time import strptime

In [3]: hour_dict = {strptime(time, "%m/%d/%Y %H:%M").tm_hour:val for time, val in list1}

In [4]: hour_dict
Out[5]: {9: 1, 13: 29, 10: 1, 14: 3, 16: 17, 23: 1, 12: 4, 17: 2}
}

我尝试了第三个选项:对于列表1中的行:date_time=row[0]res=datetime.strtime(date_time,%m/%d/%Y%H:%m)print(res.time().hour)输出为:ValueError:time数据“8”与格式“%m/%d/%Y%H:%m”不匹配。只有在执行下一步操作时才能出现此类错误:
datetime.strtime.strtime('8','%m/%d/%Y%H:%m'))
当然,
strtime
不能解析这样的字符串
In [1]: list1 = [['8/16/2016 9:55', 6], ['11/22/2015 13:43', 29], ['5/2/2016 10:14', 1],
      : ['8/2/2016 14:20', 3], ['10/15/2015 16:38', 17], ['9/26/2015 23:23', 1],
      : ['4/22/2016 12:24', 4], ['11/16/2015 9:22', 1], ['2/24/2016 17:57', 1],
      : ['6/4/2016 17:17', 2]]

In [2]: from time import strptime

In [3]: hour_dict = {strptime(time, "%m/%d/%Y %H:%M").tm_hour:val for time, val in list1}

In [4]: hour_dict
Out[5]: {9: 1, 13: 29, 10: 1, 14: 3, 16: 17, 23: 1, 12: 4, 17: 2}
}