我有一个大型数据集,其中每一行代表某个时间间隔(开始和结束之间)的某种类型(想象传感器)的值.它看起来像这样:
start end type value
2015-01-01 2015-01-05 1 3
2015-01-06 2015-01-08 1 2
2015-01-05 2015-01-08 3 3
2015-01-13 2015-01-16 2 1
Run Code Online (Sandbox Code Playgroud)
我想将它变成每日时间索引框架,如下所示:
day type value
2015-01-01 1 3
2015-01-02 1 3
2015-01-03 1 3
2015-01-04 1 3
2015-01-05 1 3
2015-01-06 1 2
2015-01-07 1 2
2015-01-08 1 2
2015-01-05 3 3
2015-01-16 3 3
2015-01-07 3 3
2015-01-08 3 3
2015-01-13 2 1
2015-01-14 2 1
2015-01-15 2 1
2015-01-16 2 1
Run Code Online (Sandbox Code Playgroud)
(请注意,我们不能对间隔做出任何假设:它们应该是连续的且不重叠但我们不能保证)
基于这些Stack Overflow答案[1](日期范围上的DataFrame重新采样)[2]( …
resample() 是一个基于时间的分组,然后对其每个组进行缩减方法。
然而,在比较groupby 中resamplevs的使用时,我注意到性能上存在巨大差异(有利于)pd.Grouperpd.Grouper
我有一个数据框,其中每行代表特定类型(认为是传感器)在某一天的值。它看起来像这样:
date type value
2018-01-01 1 12
2018-01-02 1 14
....
2018-01-01 2 12
....
Run Code Online (Sandbox Code Playgroud)
在该数据框上
df.set_index('DT').sort_index().groupby(['type']).resample('W').first()
Run Code Online (Sandbox Code Playgroud)
和
df.groupby(['type', pd.Grouper(key='DT', freq='W')]).first()
Run Code Online (Sandbox Code Playgroud)
做完全相同的事情。然而,在下面的示例数据集上,该resample方法比pd.Grouper方法慢约 30 倍(这与我在真实数据集上观察到的结果一致)。
这种性能下降从何而来?
# Creating the frame
date_range = pd.date_range(start=dt.datetime(2017,1,1), end=dt.datetime(2025,12,31), freq='W')
to_concat = []
for val in range(1,100):
frame_tmp = pd.DataFrame()
frame_tmp['DT'] = date_range
frame_tmp['type'] = val
frame_tmp['value'] = np.random.randint(1, 6, frame_tmp.shape[0])
to_concat.append(frame_tmp)
df = pd.concat(to_concat, ignore_index=True)
%%timeit
df.set_index('DT').sort_index().groupby(['type']).resample('W').first()
%%timeit
df.sort_values('DT').groupby(['type', pd.Grouper(key='DT', …Run Code Online (Sandbox Code Playgroud)