2016-08-04 50 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