我需要对时间戳字段重新采样,但我没有使用 pandas 的
resample
方法取得成功。下表介绍了使用两种方法进行重采样:resample
和 groupby with ceil
。有没有办法只使用 resample
来获得第二种方法计算的结果?顺便说一句,第二种方法的结果适合我的项目。
我已经尝试在文档中使用
closed
和 convetion
参数的组合(https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.resample.html),但没有成功.
import pandas as pd
import numpy as np
periods = 12
df = pd.DataFrame({
'datetime': pd.date_range('2020-01-01 00:45:00', freq='15T', periods=periods),
'value': np.random.randint(1, 10, periods),
})
df['datetime_ceil'] = df['datetime'].dt.ceil('H')
display(df)
df_agg_resample = df[['datetime', 'value']].resample('H', on='datetime').sum().reset_index().rename(columns={'datetime': 'datetime_resample'}).shift(-1)
df_agg_ceil = df[['datetime_ceil', 'value']].groupby('datetime_ceil').sum().reset_index()
df_agg = pd.concat([df_agg_resample, df_agg_ceil], axis=1)
df_agg
datetime value datetime_ceil
0 2020-01-01 00:45:00 2 2020-01-01 01:00:00
1 2020-01-01 01:00:00 3 2020-01-01 01:00:00
2 2020-01-01 01:15:00 1 2020-01-01 02:00:00
3 2020-01-01 01:30:00 5 2020-01-01 02:00:00
4 2020-01-01 01:45:00 2 2020-01-01 02:00:00
5 2020-01-01 02:00:00 7 2020-01-01 02:00:00
6 2020-01-01 02:15:00 7 2020-01-01 03:00:00
7 2020-01-01 02:30:00 6 2020-01-01 03:00:00
8 2020-01-01 02:45:00 4 2020-01-01 03:00:00
9 2020-01-01 03:00:00 1 2020-01-01 03:00:00
10 2020-01-01 03:15:00 2 2020-01-01 04:00:00
11 2020-01-01 03:30:00 3 2020-01-01 04:00:00
datetime_resample value datetime_ceil value
0 2020-01-01 01:00:00 11.0 2020-01-01 01:00:00 5
1 2020-01-01 02:00:00 24.0 2020-01-01 02:00:00 15
2 2020-01-01 03:00:00 6.0 2020-01-01 03:00:00 18
3 NaT NaN 2020-01-01 04:00:00 5
是的,您可以使用
resample
方法获得与第二种方法相同的结果。您可以使用 origin
参数指定重采样的起点。这是一个例子:
import pandas as pd
import numpy as np
periods = 12
df = pd.DataFrame({
'datetime': pd.date_range('2020-01-01 00:45:00', freq='15T', periods=periods),
'value': np.random.randint(1, 10, periods),
})
df['datetime_ceil'] = df['datetime'].dt.ceil('H')
display(df)
df_agg_resample = df[['datetime', 'value']].resample('H', on='datetime', origin='start').sum().reset_index().rename(columns={'datetime': 'datetime_resample'})
df_agg_ceil = df[['datetime_ceil','value']].groupby('datetime_ceil').sum().reset_index()
df_agg = pd.concat([df_agg_resample, df_agg_ceil], axis=1)
df_agg
你可以使用 pd.Grouper() 吗?
df.groupby(pd.Grouper(key='datetime', axis=0, freq='H')).sum()