Python pandas调用between_time计算夜间均值报DatetimeIndex错误
报错原因
between_time() 仅对DatetimeIndex类型的索引生效,不会自动识别普通列中的时间值。你虽然通过parse_dates把time列转成了时间类型,但它始终是普通数据列,没有被设置为DataFrame的索引,所以触发类型错误。
你现有代码另外还有两个会影响结果/运行的问题:
- 时间筛选范围只到2022-05-20 23:59,会漏掉5月20日晚到21日凌晨的夜间时段,凑不够3个完整夜间
- 最后筛选站点时写的变量名是
nights,和你前面定义的heat_nights不一致,运行到这行会报变量不存在的错误
修正方案
方案1:设置时间索引(适配你原代码的写法,解决报错最直接)
把time列设为索引之后就能正常调用between_time,建议先筛选站点再做后续计算,减少不必要的数据遍历:
import pandas as pd data = pd.read_csv( fp, sep = ";", parse_dates =["time"], encoding = "unicode_escape" ) # 先筛目标站点,缩小处理范围 station_a = data[data["name"] == "station_a"].copy() # *核心步骤:把time列设为DatetimeIndex* station_a = station_a.set_index("time") # 时间范围要覆盖3个完整夜间:从5月18日0点到5月21日凌晨5点 heat_period = station_a.loc["2022-05-18 00:00":"2022-05-21 05:00"] # 全时段平均温度 mean_all = heat_period["temperature"].mean() # 跨天夜间筛选,between_time原生支持这种结束时间早于开始时间的跨日场景 heat_nights = heat_period.between_time("21:00", "05:00") mean_night = heat_nights["temperature"].mean()
方案2:不修改索引,直接按小时判断
如果不想改动数据的索引结构,可以直接取时间列的小时字段做逻辑判断,不需要依赖between_time:
station_a = data[data["name"] == "station_a"] # 筛选对应时间范围 heat_period = station_a[(station_a["time"] >= "2022-05-18") & (station_a["time"] <= "2022-05-21 05:00")] # 小时≥21(前半夜)或小时≤5(凌晨)即为目标夜间时段 night_mask = (heat_period["time"].dt.hour >=21) | (heat_period["time"].dt.hour <=5) heat_nights = heat_period[night_mask] mean_night = heat_nights["temperature"].mean()
补充说明
- 两种方案计算结果完全一致,数据量超过10万行时,设索引调用
between_time的运行速度会明显快于逐行判断小时的方式 - 注意
between_time的时间参数不要加日期,只写时分即可 - 如果数据里存在缺失的温度值,计算均值时pandas会自动忽略NaN值,不需要额外处理
内容的提问来源于stack exchange,提问作者Vilerala
相关产品推荐
相关产品推荐

