在处理相关问题后,我发现这种行为resample
令人困惑。以下是一些时间序列数据,间隔为 5 分钟,但缺少行(最后构建的代码):
user value total
2020-01-01 09:00:00 fred 1 1
2020-01-01 09:05:00 fred 13 1
2020-01-01 09:15:00 fred 27 3
2020-01-01 09:30:00 fred 40 12
2020-01-01 09:35:00 fred 15 12
2020-01-01 10:00:00 fred 19 16
我想为每一列使用不同的方法来填充缺失的时间来填充缺失的数据。对于user
和total
,我想向前填充,而对于 ,value
我想用零填充。
我发现的一种方法是resample
,然后在事后填写缺失的数据:
resampled = df.resample('5T').asfreq()
resampled['user'].ffill(inplace=True)
resampled['total'].ffill(inplace=True)
resampled['value'].fillna(0, inplace=True)
这给出了正确的预期输出:
user value total
2020-01-01 09:00:00 fred 1.0 1.0
2020-01-01 09:05:00 fred 13.0 1.0
2020-01-01 09:10:00 fred 0.0 1.0
2020-01-01 09:15:00 fred 27.0 3.0
2020-01-01 09:20:00 fred 0.0 3.0
2020-01-01 09:25:00 fred 0.0 3.0
2020-01-01 09:30:00 fred 40.0 12.0
2020-01-01 09:35:00 fred 15.0 12.0
2020-01-01 09:40:00 fred 0.0 12.0
2020-01-01 09:45:00 fred 0.0 12.0
2020-01-01 09:50:00 fred 0.0 12.0
2020-01-01 09:55:00 fred 0.0 12.0
2020-01-01 10:00:00 fred 19.0 16.0
我认为一个人可以用来agg
按列指定要做什么。我尝试执行以下操作:
resampled = df.resample('5T').agg({'user':'ffill',
'value':'sum',
'total':'ffill'})
我发现这更清晰,更简单,但它没有给出预期的输出。总和有效,但前向填充无效:
user value total
2020-01-01 09:00:00 fred 1 1.0
2020-01-01 09:05:00 fred 13 1.0
2020-01-01 09:10:00 NaN 0 NaN
2020-01-01 09:15:00 fred 27 3.0
2020-01-01 09:20:00 NaN 0 NaN
2020-01-01 09:25:00 NaN 0 NaN
2020-01-01 09:30:00 fred 40 12.0
2020-01-01 09:35:00 fred 15 12.0
2020-01-01 09:40:00 NaN 0 NaN
2020-01-01 09:45:00 NaN 0 NaN
2020-01-01 09:50:00 NaN 0 NaN
2020-01-01 09:55:00 NaN 0 NaN
2020-01-01 10:00:00 fred 19 16.0
有人可以解释这个输出吗,如果有办法使用来实现预期的输出agg
?前向填充在这里不起作用似乎很奇怪,但如果我只是这样做resampled = df.resample('5T').ffill()
,那将适用于每一列(但在这里不受欢迎,因为它也适用于value
列)。我最接近的是为每列单独运行重新采样并应用我想要的功能:
resampled = pd.DataFrame()
d = {'user':'ffill',
'value':'sum',
'total':'ffill'}
for k, v in d.items():
resampled[k] = df[k].resample('5T').apply(v)
这可行,但感觉很傻,因为它增加了额外的迭代并使用了我试图传递给的字典agg
!我看过一些帖子agg
,apply
但似乎无法解释这里发生了什么:
我也尝试过使用groupby
with apd.Grouper
和使用pd.NamedAgg
类,但没有运气。
示例数据:
import pandas as pd
dates = ['01-01-2020 9:00', '01-01-2020 9:05', '01-01-2020 9:15',
'01-01-2020 9:30', '01-01-2020 9:35', '01-01-2020 10:00']
dates = pd.to_datetime(dates)
df = pd.DataFrame({'user':['fred']*len(dates),
'value':[1,13,27,40,15,19],
'total':[1,1,3,12,12,16]},
index=dates)