基于10分钟时间序列生成15分钟重采样DataFrame及整点校验方法
时间序列重采样:10分钟转15分钟按规则填充
问题背景
原始10分钟间隔时间序列数据:
df.index value 2019-02-28 00:00:00 101 2019-02-28 00:10:00 97 2019-02-28 00:20:00 97 2019-02-28 00:30:00 96 2019-02-28 00:40:00 110 2019-02-28 00:50:00 117 2019-02-28 01:00:00 121 2019-02-28 01:10:00 114 2019-02-28 01:20:00 112 2019-02-28 01:30:00 103 2019-02-28 01:40:00 104 2019-02-28 01:50:00 105 2019-02-28 02:00:00 106 2019-02-28 02:10:00 104 2019-02-28 02:20:00 103 2019-02-28 02:30:00 97 2019-02-28 02:40:00 101 2019-02-28 02:50:00 103 2019-02-28 03:00:00 102 2019-02-28 03:10:00 101
核心需求:
- 生成15分钟间隔的新DataFrame
- 填充规则:
- 整点(00分)和30分时刻:直接取用原数据对应值
- 15分时刻:取原数据10分和20分的均值
- 45分时刻:取原数据40分和50分的均值
- 前置校验:确认原DataFrame是否从整点开始
报错原因分析
你尝试的代码中,range(0,len(df_15+1),6)一行存在两个关键问题:
- DatetimeArray操作错误:
df_15是由时间序列转换的DataFrame,直接对其做+1属于整数与DatetimeArray的直接加减,这是Pandas已废弃的操作,因此抛出TypeError。 - 循环逻辑错误:每小时的15分钟间隔数据有4个时间点,对应原数据6个10分钟点,按步长6循环不符合数据对应关系。
解决方案代码
import pandas as pd # 构造原始数据(若已有df可跳过此部分) data = { 'value': [101,97,97,96,110,117,121,114,112,103,104,105,106,104,103,97,101,103,102,101] } index = pd.date_range('2019-02-28 00:00:00', periods=20, freq='10T') df = pd.DataFrame(data, index=index) # 校验原始数据是否从整点开始 if df.index[0].minute != 0: raise ValueError("原始数据未从整点开始,请检查数据起始时间") # 生成15分钟间隔的目标时间索引 target_index = pd.date_range(start=df.index[0], end=df.index[-1], freq='15T') df_15 = pd.DataFrame(index=target_index, columns=['value']) # 按规则填充每个时间点的值 for dt in target_index: minute = dt.minute if minute in (0, 30): # 整点/30分直接取原数据 df_15.loc[dt, 'value'] = df.loc[dt, 'value'] elif minute == 15: # 15分取10分和20分的均值 t10 = dt - pd.Timedelta(minutes=5) t20 = dt + pd.Timedelta(minutes=5) df_15.loc[dt, 'value'] = (df.loc[t10, 'value'] + df.loc[t20, 'value']) / 2 elif minute == 45: # 45分取40分和50分的均值 t40 = dt - pd.Timedelta(minutes=5) t50 = dt + pd.Timedelta(minutes=5) df_15.loc[dt, 'value'] = (df.loc[t40, 'value'] + df.loc[t50, 'value']) / 2 print(df_15)
运行结果
value 2019-02-28 00:00:00 101.0 2019-02-28 00:15:00 97.0 2019-02-28 00:30:00 96.0 2019-02-28 00:45:00 113.5 2019-02-28 01:00:00 121.0 2019-02-28 01:15:00 113.0 2019-02-28 01:30:00 103.0 2019-02-28 01:45:00 104.5 2019-02-28 02:00:00 106.0 2019-02-28 02:15:00 103.5 2019-02-28 02:30:00 97.0 2019-02-28 02:45:00 102.0 2019-02-28 03:00:00 102.0
内容的提问来源于stack exchange,提问作者blackk029
相关产品推荐
相关产品推荐

