2011-01-08 71 views
2

我剛開始使用Python作爲愛好,所以如果這是一個愚蠢的問題,請原諒我。如何輕鬆操作Python字典中的時間戳記?

我最近在我的電腦上安裝了一個功率計,我正在使用它來跟蹤它的功耗。它給我實時分讀數導出到csv文件。

我已經解析並讀取了文件,現在我有一個字典,其中的鍵是時間戳,從時間庫存儲爲struct_time。目前,該字典每分鐘都有讀數。我想創建一個新的字典,其關鍵是小時時間戳,其值是各個分鐘讀數的總和。

我想到了通過字典循環使用計數器mod 60,但我被告知這不是很pythonic。而且,不能保證每小時都有60個讀數。我應該怎麼做?

回答

4

首先,我建議使用datetime.datetime類而不是time.time_struct,因爲後者實際上只是一個9元組的弱包裝,但前者是一個帶操作符重載等的全功能類。接下來,您可以使用collections.defaultdict輕鬆地構建你所需的總讀數:

# power_reading is the data type corresponding to one set of power readings 
# (it could be a simple float, or a tuple, or a class if you want; just make 
# sure that you can add them together) 
hourly_readings = collections.defaultdict(power_reading) 
minutely_readings = { ... }; # dict of time.struct_time ==> power_reading 

for timestamp, reading in minutely_readings.iteritems(): 
    hour = datetime.datetime(timestamp.tm_year, timestamp.tm_mon, 
          timestamp.tm_mday, timestamp.tm_hour); 
    hourly_readings[hour] += reading 

如果power_reading是一個元組,你不能使用+=(因爲串接的元組,而不是做逐元素添加),所以你必須這樣做,而不是:

在Python
8

如果我理解你的問題是正確的,這應該做的工作:

from collections import defaultdict 
output = defaultdict(int) 
for key, value in readings.iteritems(): 
    output[key.tm_hour] += value 

使用defaultdict的優點是,它會通過返回0作爲值處理的缺失小時的情況。

編輯:

正如克里斯蒂安指出OP可能有好幾天的讀數。在這種情況下,我按照最初由亞當羅森菲爾德有輕微的修改出臺的建議:

from collections import defaultdict 
from datetime import datetime 
output = defaultdict(int) 
for key, value in readings.iteritems(): 
    output[datetime(*x[:4])] += value 

這將構建由日,月,年和小時日期沒有幾分鐘或幾秒鐘。

+0

1;比我的好 – aeter 2011-01-08 19:31:16

+0

如果他有多天的閱讀,會發生什麼? – 2011-01-08 19:35:23

0

一行:

{time.struct_time(i+(0,0,0,0)):sum(k[1] for k in j) for i,j in itertools.groupby(sorted(D.items()),lambda x:x[0][:4])} 

Python2:

result={} 
tmp=(0,)*4 
for i,j in itertools.groupby(sorted(D.items()),lambda x:x[0][:4]): 
    result[time.struct_time(i+tmp)]=sum(k[1] for k in j)