2012-07-10 126 views
0

下面是我在解析csv文件时按时间范围对项目进行分组时,它工作正常,但现在我想按4h和30mn创建切片,此特定代码仅适用于我想创建4小时切片(或30米切片)按时间段对值进行分组

tf = "%d-%b-%Y-%H" 

lmb = lambda d: datetime.datetime.strptime(d["Date[G]"]+"-"+d["Time[G]"], "%d-%b-%Y-%H:%M:%S.%f").strftime(tf) 

for k, g in itertools.groupby(csvReader, key = lmb): 
    for i in g: 
     "do something" 

谢谢!

回答

1

一般的最佳方法是让groupby键返回一个元组,将项目分组到相应的存储桶中。

例如,对于4H片:

def by_4h(d): 
    dt = datetime.datetime.strptime(d["Date[G]"]+"-"+d["Time[G]"], "%d-%b-%Y-%H:%M:%S.%f") 
    return (dt.year, dt.month, dt.day, dt.hour // 4) 

你现在知道,如果两个时间都在同一4小时片(从午夜开始),然后hour // 4会产生相同的结果对于那些时间,所以你在那里结束元组。

或为30米片:

def by_30m(d): 
    dt = datetime.datetime.strptime(d["Date[G]"]+"-"+d["Time[G]"], "%d-%b-%Y-%H:%M:%S.%f") 
    return (dt.year, dt.month, dt.day, dt.hour, dt.minute // 30) 

这是使用//整数除法为Python 3兼容的,但是它也可以在Python 2.x和清楚地表明,你想整数除法。

+1

无论如何,为了防止某人在某处导入了true_division,不妨在Python 2.x中明确地使用'//' – 2012-07-10 13:26:15