2

在处理相关问题后,我发现这种行为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

我想为每一列使用不同的方法来填充缺失的时间来填充缺失的数据。对于usertotal,我想向前填充,而对于 ,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!我看过一些帖子aggapply但似乎无法解释这里发生了什么:

我也尝试过使用groupbywith 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)
4

0 回答 0