如何用Pandas将DataFrame重采样为30分钟间隔并填充均值?
Pandas重采样时间序列并分配日均至30分钟区间的问题
原始数据结构
[ { "datetime":"2021-05-21 00:00:00", "value":5 }, { "datetime":"2021-05-22 00:00:00", "value":6 } ]
- 其中
datetime字段支持小时/分钟/天/月/年等时间格式
需求
将上述数据重采样为30分钟间隔,把每日的value平均分配到每个30分钟区间(例如5÷48≈0.104166667,6÷48=0.125)。
现有代码问题
尝试以下代码时,虽能生成30分钟间隔,但结果全为NaN,未正确计算均值:
df = pd.DataFrame(data) df["datetime"] = df["datetime"].apply(pd.to_datetime) df.set_index("datetime") df.resample("30min").mean()
期望输出格式
[ { "datetime":"2021-05-21 00:00:00", "value":0.104166667 }, { "datetime":"2021-05-21 00:30:00", "value":0.104166667 }, { "datetime":"2021-05-21 01:00:00", "value":0.104166667 }, ... { "datetime":"2021-05-22 00:00:00", "value":0.125 }, { "datetime":"2021-05-22 00:30:00", "value":0.125 }, ... ]
解决方案
问题根源
df.set_index("datetime")默认返回新的DataFrame,不会修改原df,后续resample还是基于原df的默认索引执行,导致无数据匹配,返回NaN。- 普通的
resample.mean()用于计算区间内已有数据的均值,但这里需求是将单日总量分摊到每个子区间,需要先补全时间序列再分配数值。
正确代码示例
import pandas as pd data = [ {"datetime":"2021-05-21 00:00:00", "value":5}, {"datetime":"2021-05-22 00:00:00", "value":6} ] # 1. 转换时间格式并设置为索引 df = pd.DataFrame(data) df["datetime"] = pd.to_datetime(df["datetime"]) df = df.set_index("datetime") # 2. 重采样为30分钟间隔,向前填充缺失的时间点对应的value resampled_df = df.resample("30min").ffill() # 3. 将单日总量平均分配到每个30分钟区间(一天共48个30分钟间隔) resampled_df["value"] = resampled_df["value"] / 48 # 转换为期望的JSON格式 result = resampled_df.reset_index().rename(columns={"index": "datetime"}).to_dict("records") print(result)
代码说明
df.set_index("datetime")赋值回df,确保后续操作基于时间索引执行。resample("30min").ffill()会生成完整的30分钟时间序列,并将前一个时间点的value填充到后续区间。- 因为一天有48个30分钟区间,所以将每个区间的
value除以48,得到日均分摊后的数值。
内容的提问来源于stack exchange,提问作者Potato
相关产品推荐
相关产品推荐

