如何使用resample函数生成每日10:00至次日9:00的23小时平均数据
解决方案
针对你的需求,这里提供两种无需删除数据的代码实现,核心是通过时间偏移或自定义分组来对齐你需要的23小时窗口(每日10:00至次日9:00):
前提准备
确保你的时间序列数据索引是datetime64类型:
import pandas as pd # 转换索引为datetime(如果还未转换) Data_s.index = pd.to_datetime(Data_s.index)
方法一:时间偏移+按天重采样
通过偏移时间将目标窗口对齐到自然日,再重采样计算均值:
# 将所有时间向后偏移10小时,原10:00变为00:00,次日9:00变为前一日23:00 offset_data = Data_s.tshift(-10, freq='H') # 按自然日重采样计算均值,此时每个日均值对应原数据的10:00-次日9:00窗口 daily_avg = offset_data.resample('D').mean() # 将结果索引偏移回10小时,让索引对应窗口的起始时间(如2022-03-11 10:00) daily_avg.index = daily_avg.index.shift(10, freq='H') # 过滤超出原数据范围的无效窗口(比如最后一个窗口若超出4月11日则剔除) daily_avg = daily_avg.loc[daily_avg.index <= Data_s.index.max() - pd.Timedelta(hours=23)]
方法二:自定义分组键
通过调整时间生成分组键,直接按目标窗口分组计算:
# 生成分组键:每个时间减去10小时后取日期,这样10:00-次日9:00的时间会被分到同一日期组 group_key = (Data_s.index - pd.Timedelta(hours=10)).date # 按分组键计算均值 daily_avg = Data_s.groupby(group_key).mean() # 将分组键转换为窗口起始时间(日期+10小时) daily_avg.index = pd.to_datetime(daily_avg.index) + pd.Timedelta(hours=10)
验证结果
可以手动计算某一窗口的均值来验证代码正确性:
# 验证2022-03-11 10:00至2022-03-12 09:00的均值 mask = (Data_s.index >= '2022-03-11 10:00') & (Data_s.index < '2022-03-12 09:00') manual_avg = Data_s.loc[mask].mean() print("代码计算结果:", daily_avg.loc['2022-03-11 10:00']) print("手动计算结果:", manual_avg)
内容的提问来源于stack exchange,提问作者ARMIR
相关产品推荐
相关产品推荐

