2016-08-04 49 views
1

我需要計算2015-01-01和2015-12-31之間的一些事件的總和,每天晚上21:30至04:30之間進行天?如何按特定時間窗口對數據進行分組,其中第二次是第二天

如何通過使用熊貓以最優雅,但可能的簡單和有效的方式?

示例結果表應類似於以下內容:

   count 
2015-04-01  38 (events between 2015-03-31 21:30 and 2015-04-01 04:30) 
2015-04-02  15 (events between 2015-04-01 21:30 and 2015-04-02 04:30) 
2015-04-03  27 (events between 2015-04-02 21:30 and 2015-04-03 04:30) 

感謝您的幫助和建議。

+1

你應該把你的數據 –

回答

1

您可以使用:

df = pd.DataFrame({'a':['2015-04-01 15:00','2015-04-01 23:00','2015-04-01 04:00','2015-04-02 03:00','2015-05-02 16:00','2015-04-03 02:00'], 
        'b':[2,4,3,1,7,10]}) 
df['a'] = pd.to_datetime(df.a) 
print (df) 
        a b 
0 2015-04-01 15:00:00 2 
1 2015-04-01 23:00:00 4 
2 2015-04-01 04:00:00 3 
3 2015-04-02 03:00:00 1 
4 2015-05-02 16:00:00 7 
5 2015-04-03 02:00:00 10 

創建DatetimeIndex

start = pd.to_datetime('2015-04-01') 
d = pd.date_range(start, periods=3) 
print (d) 
DatetimeIndex(['2015-04-01', '2015-04-02', '2015-04-03'], dtype='datetime64[ns]', freq='D') 

環商業DatetimeIndex,通過boolean indexing選擇所有的行,並得到len

for dat in d: 
    date_sum = len(df.ix[(df.a >= dat.date()+pd.offsets.DateOffset(hours=21, minutes=30)) & 
       (df.a <= dat.date()+pd.offsets.DateOffset(days=1, hours=4, minutes=30)),'b']) 
    print (date_sum) 
    print (dat.date()) 
2 
2015-04-01 
1 
2015-04-02 
0 

通過字典理解創建新Series

out = { dat.date(): len(df.ix[(df.a >= dat.date() + pd.offsets.DateOffset(hours=21, minutes=30)) & (df.a <= dat.date() + pd.offsets.DateOffset(days=1, hours=4, minutes=30)), 'b']) for dat in d} 
s = pd.Series(out) 
print (s) 
2015-04-01 2 
2015-04-02 1 
2015-04-03 0 
dtype: int64 
+0

我喜歡它的一個樣本。我只是想知道這是不是太慢,當數據是巨大的。無論如何偉大的工作 –

+0

謝謝。它看起來非常複雜,但我相信來自OP的數據可以更簡單。 – jezrael