2012-07-10 124 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