2016-11-21 16 views
0

我有一個datetime對象列表,日期範圍跨越多年。將包含多天的datetime對象列表放入2小時垃圾桶中

我想將這些日期分成2個小時分檔。因此,對於0小時箱,從23:00 - 1:00的所有日期時間都將進入該箱(+/- 1小時)。

最後,我想要一個列表中的每個日期時間的索引列表中的一個斌。所以,如果我的日期時間列表是像

datetime.datetime(2014, 10, 3, 20, 29, 54, 268074), 
    datetime.datetime(2014, 10, 4, 11, 28, 34, 59937), 
    datetime.datetime(2014, 10, 4, 19, 40, 39, 718856), 
    datetime.datetime(2016, 8, 18, 12, 17, 57, 417245), 
    datetime.datetime(2016, 8, 19, 1, 37, 57, 465573) 

我要像一個列表的列表的結果:

[[], 
[4], 
[], 
[], 
[], 
[], 
[1,3], 
[], 
[], 
[], 
[0,2], 
[]] 

凡結果[0]給我對應於最接近日期時間索引列表0:00,結果[0]給出最接近2:00的列表等。

我的第一個想法是使用datetime.time對象來創建一個小時列表,然後從我的列表中減去一個日期時間並找到最小值。

import datetime 
hrs = array([datetime.time(t) for t in arange(0,24,2)]) 
closetHr = min(hrs - times[0].time()) 

但是,這給我的錯誤unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'

+0

您還使用了其他什麼進口產品? –

回答

1

這將產生對樣品輸入預期的輸出,避免了時間的減法運算:

bins = [[] for t in arange(0,24,2)] 
for i,t in enumerate(times): 
    ix = (t.hour+1)%24  # "normalize" the hour 
    bins[ix/2].append(i) # convert to a bin index 

,如果這是你想要當什麼不清楚價值是在一個奇數小時的邊界(即1:00),但你沒有指定。

+0

完美。我所有的時間都下降到毫秒級,因此從未完全落在我的數據集的邊界上,所以在這裏它不是問題。 – hm8

+0

我會如何修改這個分成3小時的箱子,在每個小時的每邊都有+/- 1.5小時?所以第一個箱子將是22:30 - 1:30(0:00 +/1 1.5小時),第二個將是1:30 - 4:30等 – hm8

+0

@ user3826115:這應該是它自己的問題,但你需要考慮't.minute'。 –