我有一个反复出现的pandas
问题,我想通过包装.resample
方法来解决。我就是想不通,怎么弄。
背景(非必要)
我有时区感知时间序列,例如:
s = pd.Series([5,19,-4], pd.date_range('2020-10-01', freq='D', periods=3, tz='Europe/Berlin', name='ts_left'))
s
ts_left
2020-10-01 00:00:00+02:00 5
2020-10-02 00:00:00+02:00 19
2020-10-03 00:00:00+02:00 -4
Freq: D, dtype: int64
我想重新采样到几个小时。如果我只使用s.resample('H').sum()
,最后 23 小时将被丢弃(也在这个问题中解决):
s.resample('H').sum()
ts_left
2020-10-01 00:00:00+02:00 5
2020-10-01 01:00:00+02:00 0
...
2020-10-01 23:00:00+02:00 0
2020-10-02 00:00:00+02:00 19
2020-10-02 01:00:00+02:00 0
...
2020-10-02 23:00:00+02:00 0
2020-10-03 00:00:00+02:00 -4
Freq: H, Length: 49, dtype: int64
当前的“解决方案”
我编写了一个自定义resample2
函数来纠正这个问题:
def resample2(df, freq, func):
if type(df.index) != pd.DatetimeIndex:
return df.resample(freq).apply(func)
else:
#add one row
idx = [df.index[-1] + df.index.freq]
if type(df) == pd.DataFrame:
df = df.append(pd.DataFrame([[None] * len(df.columns)], idx))
elif type(df) == pd.Series:
df = df.append(pd.Series([None], idx))
df = df.resample(freq).apply(func)
return df.iloc[:-1] #remove one row
这有效:
resample2(s, 'H', np.sum)
2020-10-01 00:00:00+02:00 5
2020-10-01 01:00:00+02:00 0
...
2020-10-01 23:00:00+02:00 0
2020-10-02 00:00:00+02:00 19
2020-10-02 01:00:00+02:00 0
...
2020-10-02 23:00:00+02:00 0
2020-10-03 00:00:00+02:00 -4
2020-10-03 01:00:00+02:00 0
...
2020-10-03 23:00:00+02:00 0
Freq: H, Length: 72, dtype: int64
但有两个问题:
- 用法与标准用法(
resample2(s, 'H', np.sum)
vss.resample('H').sum()
和 - 我无法使用以前可以使用的所有功能。例如,
resample2(s, 'H', s.resample.ffill)
给出一个错误。
问题
有没有办法包装DataFrame.resample
和Series.resample
方法的功能,以便它们可以像往常一样继续工作,只需在我的函数中显示“在重采样前追加一行,重采样后删除最后一行”resample2
功能?