Pandas groupby 后的时间序列重采样,以在某些初始(或最终)值缺失时包含缺失间隔
Pandas timeseries resampling after groupby to include missing intervals when some initial (or final) values are missing
我有一个包含一些子组的时间序列数据集(1 分钟),我想将其重新采样到较低的频率(比如 5 分钟)。但是在其中一些组中,数据的开始时间与我感兴趣的时间戳不同,因为所有组的所有重采样输出的开始时间都是如此。这是一个创建的数据集来解释这种情况:
import pandas as pd
rng1 = pd.date_range('2000-01-01', periods=10, freq='T')
ts1 = pd.DataFrame(data={'factor': ['A']*10, 'value': [1]*10, 'dummy':np.arange(10)}, index=rng1)
rng2 = pd.date_range('2000-01-01 00:06', periods=10, freq='T')
ts2 = pd.DataFrame(data={'factor': ['B']*10, 'value': [1]*10, 'dummy':np.arange(10)}, index=rng2)
ts3 = ts1.append(ts2)
ts3.groupby(by='factor').resample('5min').sum()
因此,这是数据集最初的样子 (ts3):
dummy factor value
2000-01-01 00:00:00 0 A 1
2000-01-01 00:01:00 1 A 1
2000-01-01 00:02:00 2 A 1
2000-01-01 00:03:00 3 A 1
2000-01-01 00:04:00 4 A 1
2000-01-01 00:05:00 5 A 1
2000-01-01 00:06:00 6 A 1
2000-01-01 00:07:00 7 A 1
2000-01-01 00:08:00 8 A 1
2000-01-01 00:09:00 9 A 1
2000-01-01 00:06:00 0 B 1
2000-01-01 00:07:00 1 B 1
2000-01-01 00:08:00 2 B 1
2000-01-01 00:09:00 3 B 1
2000-01-01 00:10:00 4 B 1
2000-01-01 00:11:00 5 B 1
2000-01-01 00:12:00 6 B 1
2000-01-01 00:13:00 7 B 1
2000-01-01 00:14:00 8 B 1
2000-01-01 00:15:00 9 B 1
而当前的输出是这样的(如您所见,对于 B 组,原始数据中最早的时间戳是“2001-01-01 00:06:00”,因此第一个重采样时间戳是“2001” -01-01 00:05:00',这是完全可以理解的;因此原始数据中的最后一个时间戳也是'2001-01-01 00:09:00',因此A组的最后一个重采样时间戳是'2001 -01-01 00:05:00'):
dummy value
factor
A 2000-01-01 00:00:00 10 5
2000-01-01 00:05:00 35 5
B 2000-01-01 00:05:00 6 4
2000-01-01 00:10:00 30 5
2000-01-01 00:15:00 9 1
我想要的输出如下(因为在这种情况下,因子 B 组的数据本身缺失,前 6 分钟;因子 B 组有数据时的最后两个 5 分钟间隔,没有因素 A 组中的等效数据):
dummy value
factor
A 2000-01-01 00:00:00 10 5
2000-01-01 00:05:00 35 5
2000-01-01 00:10:00 np.NaN np.NaN
2000-01-01 00:15:00 np.NaN np.NaN
B 2000-01-01 00:00:00 np.NaN np.NaN
2000-01-01 00:05:00 6 4
2000-01-01 00:10:00 30 5
2000-01-01 00:15:00 9 1
我没有看到 resample() 的此类用法的任何文档或示例,即指定 start/end date_time。有什么建议或指示吗?
我目前正在考虑的粗暴方法是以 1 分钟的频率为整个感兴趣的时间段创建一个 DatetimeIndex,并将其与我的 "groups" 结合以获得完整的初始行集;将它与我的数据集合并;然后重新采样。当我处理数百万行时,这似乎有点矫枉过正。谢谢。
IIUC,使用 unstack
和 stack
注意,NaN
被认为是 float
,这就是为什么您看到 dummy
和 value
变成了 float
ts3.groupby(by='factor').resample('5min').sum().unstack().stack(dropna=False)
Out[407]:
dummy value
factor
A 2000-01-01 00:00:00 10.0 5.0
2000-01-01 00:05:00 35.0 5.0
2000-01-01 00:10:00 NaN NaN
2000-01-01 00:15:00 NaN NaN
B 2000-01-01 00:00:00 NaN NaN
2000-01-01 00:05:00 6.0 4.0
2000-01-01 00:10:00 30.0 5.0
2000-01-01 00:15:00 9.0 1.0
我有一个包含一些子组的时间序列数据集(1 分钟),我想将其重新采样到较低的频率(比如 5 分钟)。但是在其中一些组中,数据的开始时间与我感兴趣的时间戳不同,因为所有组的所有重采样输出的开始时间都是如此。这是一个创建的数据集来解释这种情况:
import pandas as pd
rng1 = pd.date_range('2000-01-01', periods=10, freq='T')
ts1 = pd.DataFrame(data={'factor': ['A']*10, 'value': [1]*10, 'dummy':np.arange(10)}, index=rng1)
rng2 = pd.date_range('2000-01-01 00:06', periods=10, freq='T')
ts2 = pd.DataFrame(data={'factor': ['B']*10, 'value': [1]*10, 'dummy':np.arange(10)}, index=rng2)
ts3 = ts1.append(ts2)
ts3.groupby(by='factor').resample('5min').sum()
因此,这是数据集最初的样子 (ts3):
dummy factor value
2000-01-01 00:00:00 0 A 1
2000-01-01 00:01:00 1 A 1
2000-01-01 00:02:00 2 A 1
2000-01-01 00:03:00 3 A 1
2000-01-01 00:04:00 4 A 1
2000-01-01 00:05:00 5 A 1
2000-01-01 00:06:00 6 A 1
2000-01-01 00:07:00 7 A 1
2000-01-01 00:08:00 8 A 1
2000-01-01 00:09:00 9 A 1
2000-01-01 00:06:00 0 B 1
2000-01-01 00:07:00 1 B 1
2000-01-01 00:08:00 2 B 1
2000-01-01 00:09:00 3 B 1
2000-01-01 00:10:00 4 B 1
2000-01-01 00:11:00 5 B 1
2000-01-01 00:12:00 6 B 1
2000-01-01 00:13:00 7 B 1
2000-01-01 00:14:00 8 B 1
2000-01-01 00:15:00 9 B 1
而当前的输出是这样的(如您所见,对于 B 组,原始数据中最早的时间戳是“2001-01-01 00:06:00”,因此第一个重采样时间戳是“2001” -01-01 00:05:00',这是完全可以理解的;因此原始数据中的最后一个时间戳也是'2001-01-01 00:09:00',因此A组的最后一个重采样时间戳是'2001 -01-01 00:05:00'):
dummy value
factor
A 2000-01-01 00:00:00 10 5
2000-01-01 00:05:00 35 5
B 2000-01-01 00:05:00 6 4
2000-01-01 00:10:00 30 5
2000-01-01 00:15:00 9 1
我想要的输出如下(因为在这种情况下,因子 B 组的数据本身缺失,前 6 分钟;因子 B 组有数据时的最后两个 5 分钟间隔,没有因素 A 组中的等效数据):
dummy value
factor
A 2000-01-01 00:00:00 10 5
2000-01-01 00:05:00 35 5
2000-01-01 00:10:00 np.NaN np.NaN
2000-01-01 00:15:00 np.NaN np.NaN
B 2000-01-01 00:00:00 np.NaN np.NaN
2000-01-01 00:05:00 6 4
2000-01-01 00:10:00 30 5
2000-01-01 00:15:00 9 1
我没有看到 resample() 的此类用法的任何文档或示例,即指定 start/end date_time。有什么建议或指示吗?
我目前正在考虑的粗暴方法是以 1 分钟的频率为整个感兴趣的时间段创建一个 DatetimeIndex,并将其与我的 "groups" 结合以获得完整的初始行集;将它与我的数据集合并;然后重新采样。当我处理数百万行时,这似乎有点矫枉过正。谢谢。
IIUC,使用 unstack
和 stack
注意,NaN
被认为是 float
,这就是为什么您看到 dummy
和 value
变成了 float
ts3.groupby(by='factor').resample('5min').sum().unstack().stack(dropna=False)
Out[407]:
dummy value
factor
A 2000-01-01 00:00:00 10.0 5.0
2000-01-01 00:05:00 35.0 5.0
2000-01-01 00:10:00 NaN NaN
2000-01-01 00:15:00 NaN NaN
B 2000-01-01 00:00:00 NaN NaN
2000-01-01 00:05:00 6.0 4.0
2000-01-01 00:10:00 30.0 5.0
2000-01-01 00:15:00 9.0 1.0