如何按特定时间窗口对数据进行分组,其中第二次是第二天
问题描述:
我需要计算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)
感谢您的帮助和建议。
答
您可以使用:
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
你应该把你的数据 –