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

如何计算所有站点各月最高气温及正确理解datetime index

气象数据处理问题解答

1. 计算所有站点每个月的最高气温

你的思路方向是对的,用pandas的时间分组/重采样功能可以更高效实现,具体步骤如下:

步骤1:预处理时间列

先把datetime列转换为pandas可识别的时间格式,这是后续操作的基础:

import pandas as pd

# 加载数据(假设数据存储为CSV文件)
df = pd.read_csv('weather_data.csv')
# 转换datetime列为时间类型,匹配原始数据的日/月/年 时:分格式
df['datetime'] = pd.to_datetime(df['datetime'], format='%d/%m/%Y %H:%M')

步骤2:两种高效计算方式

方式一:按站点+月份分组聚合

直接通过groupby结合时间分组器,一次性计算每个站点每月的最高气温:

# 按stationID和月份分组,提取temperature的最大值
monthly_max_temp = df.groupby(
    ['stationID', pd.Grouper(key='datetime', freq='M')]
)['temperature'].max().reset_index()
# 重命名月份列,让结果更清晰
monthly_max_temp.rename(columns={'datetime': 'month'}, inplace=True)

方式二:先按站点分组,再按月重采样

如果需要对每个站点单独处理时间序列,这种方式更灵活:

# 先按站点分组,再对每组数据按月重采样,取最高温
monthly_max_temp = df.groupby('stationID').resample(
    'M', on='datetime'
)['temperature'].max().reset_index()

补充:指定月份范围的计算

如果只需要计算特定月份区间的最高温,可以先筛选数据再聚合:

# 筛选2010年3月到8月的数据
filtered_df = df[(df['datetime'] >= '2010-03-01') & (df['datetime'] <= '2010-08-31')]
# 再执行分组计算
filtered_monthly_max = filtered_df.groupby(
    ['stationID', pd.Grouper(key='datetime', freq='M')]
)['temperature'].max().reset_index()

2. 如何正确理解Datetime Index

Datetime Index是pandas专为时间序列数据设计的索引类型,核心价值是让时间相关操作更直观、高效:

  • 有序的时间标签:它会自动按时间先后排序,你可以直接用时间范围筛选数据,比如df.loc['2010-01':'2010-02']就能快速取出1-2月的所有记录
  • 原生支持时间周期操作:像按月/年聚合(resample)、滚动窗口计算(rolling)这类操作,必须依赖Datetime Index才能识别时间间隔,自动完成边界划分
  • 兼容普通索引功能:它可以像普通索引一样定位行,但额外提供了时间维度的逻辑支持,比如按年、月、日拆分数据,无需手动处理字符串格式
  • 直观对比:如果用普通字符串作为时间索引,你无法直接调用resample('M');但转成Datetime Index后,pandas能自动识别每个月的起始和结束时间,一键完成聚合

内容的提问来源于stack exchange,提问作者Alex Ho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:30:43