Pandas重采样问题:时间序列起始时间偏移异常排查与解决
时间序列重采样后起始时间偏移的原因与解决方法
我的初始时间序列DataFrame起始时间为2023-01-01 09:00,但使用120T(2小时)频率执行resample操作后,结果的起始时间变成了2023-01-01 08:00,请问该现象的原因是什么?有哪些可行的解决方法?
代码示例
import pandas as pd import numpy as np num_rows = 480 start_date = pd.to_datetime('2023-01-01 09:00') datetime_range = pd.date_range(start=start_date, periods=num_rows, freq='1min') random_values = np.random.randint(1, 101, size=num_rows) df = pd.DataFrame({'datetime': datetime_range, 'value': random_values}) display(df) df_resampled = df.resample('120T', on='datetime').first().reset_index() display(df_resampled)
运行结果
原始DataFrame:
datetime value 0 2023-01-01 **09:00:00** 44 1 2023-01-01 09:01:00 38 2 2023-01-01 09:02:00 55 3 2023-01-01 09:03:00 52 4 2023-01-01 09:04:00 49 ... ... ... 475 2023-01-01 16:55:00 52 476 2023-01-01 16:56:00 6 477 2023-01-01 16:57:00 46 478 2023-01-01 16:58:00 96 479 2023-01-01 16:59:00 51 480 rows × 2 columns
重采样后结果:
datetime value 0 2023-01-01 **08:00:00** 44 1 2023-01-01 10:00:00 76 2 2023-01-01 12:00:00 61 3 2023-01-01 14:00:00 27 4 2023-01-01 16:00:00 68
原因分析
Pandas的resample方法默认会基于**频率的“锚点时间”**生成时间区间,而非数据的实际起始时间。对于120T(2小时)频率,默认锚点是当天的00:00,区间按2小时依次划分:00:00-02:00、02:00-04:00……08:00-10:00。你的数据起始时间09:00属于08:00-10:00这个区间,重采样后该区间会用左端点08:00作为标签,因此结果的起始时间显示为08:00。
解决方法
指定
origin参数为数据起始点:
让resample以数据的第一个时间点作为区间锚点,生成从09:00开始的2小时区间:df_resampled = df.resample('120T', on='datetime', origin='start').first().reset_index()调整后重采样结果的起始时间会是
2023-01-01 09:00,后续区间依次为11:00、13:00等。使用
offset参数调整区间偏移:
通过设置偏移量,让区间对齐到09:00开始的时间点。由于默认锚点是00:00,添加1小时偏移后,2小时区间会变为09:00-11:00、11:00-13:00等:df_resampled = df.resample('120T', on='datetime', offset='1h').first().reset_index()过滤早于数据起始时间的区间:
如果不需要修改区间生成逻辑,直接过滤掉重采样结果中时间早于原数据起始时间的行:df_resampled = df.resample('120T', on='datetime').first().reset_index() df_resampled = df_resampled[df_resampled['datetime'] >= df['datetime'].min()]
内容的提问来源于stack exchange,提问作者Denier Pardon
相关产品推荐
相关产品推荐

