You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:33:14