Pandas 时间戳 ceil 重采样

问题描述 投票:0回答:2

我需要对时间戳字段重新采样,但我没有使用 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
pandas resampling
2个回答
0
投票

是的,您可以使用

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

0
投票

你可以使用 pd.Grouper() 吗?

df.groupby(pd.Grouper(key='datetime', axis=0, freq='H')).sum()
© www.soinside.com 2019 - 2024. All rights reserved.