日期时间列表中每周/小时的频率

时间:2014-05-10 21:21:13

标签: python datetime

我想计算一个列表中的天数/小时数。 回答这个问题:"周六上午10点发生了多少事件?"

from itertools import groupby, izip

import time
from datetime import date

 # Calculate number of events that happened 
d= ["2009-04-28 11:00:00 AM","2009-04-28 12:00:00 PM","2009-05-28 01:00:00 PM","2009-05-27 02:00:00 PM","2009-05-27 03:00:00 PM" ]


dt = [time.strptime(l, '%Y-%m-%d %I:%M:%S %p')  for l in d]
cr_dates_i=[int('{0}{1:02d}'.format(c.tm_wday, c.tm_hour)) for c in dt]
counts = [(k, len(list(g))) for (k, g) in groupby(cr_dates_i)]
print counts


eg: 
2014-05-10 12:00:00 PM ==> Friday+12 ==> 512  (Sunday 0 - Saturday 6)

问题是:我现在如何影响每个日期,频率的数量?所有可能的事件甚至是零例。

周日(0) - >星期六(6)

00:00 - > 23:00

结果,我应该有(000,... 623)

1 个答案:

答案 0 :(得分:0)

首先,我要定义一个函数,将日期时间转换为您所表达的数字:

import time

def datetime_to_num(timestr):
    # convert string to time object
    dt = time.strptime(timestr, "%Y-%m-%d %I:%M:%S %p")
    numday = (dt.tm_wday + 1) % 7 # get new day number
    numhour = dt.tm_hour # get hour number
    return int("{}{}".format(numday, numhour)) # return correct int

这将采用2014-05-10 12:00:00 PM形式的字符串,并将其转换为0623之间的整数,如您所述。如果你想要字符串,那么从'000''623'你可以删除int()语句中的return,一切都应该基本相同。那你只需要以某种方式计算这些数字的频率。因此,通常一种简单的方法是使用defaultdict

from collections import defaultdict

dtdict = defaultdict(int) # default count = 0

for dtstr in strlist: # for each string to process
    dtdict[datetime_to_num(dtstr)] += 1 # count it

然后你会得到一个形式频率的字典:

# for example:
{   '0' : 1,
    '1' : 3,
  '523' : 7,
  '623' : 4,
}

访问时,任何不存在的密钥值为0