Pandas中基于时间索引计算气候数据均值极值及解决索引访问问题
解决Pandas时间索引KeyError问题及时间维度统计
错误原因
你把Date-time设为索引后,它就不再是DataFrame的普通列了,所以用df['Date-time']会报KeyError——得从索引对象里获取时间属性,而不是列名。
完整修正步骤(附代码)
1. 正确读取并处理无表头CSV
不用自定义函数解析日期,Pandas自带的pd.to_datetime足够处理绝大多数格式,直接一步到位转日期并设为索引:
import pandas as pd # 读取无表头CSV,自定义列名(根据你的实际数据调整列数和名称) df = pd.read_csv('climate_data.csv', header=None, names=['Date-time', 'Temperature', 'Humidity', 'Pressure']) # 转datetime格式+设为索引(两种写法选一种) # 写法1:分步处理 df['Date-time'] = pd.to_datetime(df['Date-time']) # 自动识别格式,特殊格式可加format参数,比如format='%d/%m/%Y %H:%M' df = df.set_index('Date-time') # 写法2:读取时直接完成(更简洁) # df = pd.read_csv('climate_data.csv', header=None, names=['Date-time', 'Temperature', 'Humidity', 'Pressure'], # parse_dates=['Date-time'], index_col='Date-time')
2. 正确访问时间索引的属性
现在索引是DatetimeIndex类型,直接通过df.index获取年/月/周/日:
# 获取年份 print(df.index.year) # 获取月份 print(df.index.month) # 获取ISO标准周数 print(df.index.isocalendar().week) # 获取不含时分的日期 print(df.index.date)
3. 按时间维度做统计计算
有两种常用方法,选你顺手的:
方法1:用resample(时间序列专属,更直观)
resample专门针对时间索引分组,支持多种时间频率:
# 年度统计:指定列的均值、最大值、最小值 yearly_stats = df.resample('Y').agg({ 'Temperature': ['mean', 'max', 'min'], 'Humidity': ['mean', 'max', 'min'], 'Pressure': ['mean', 'max', 'min'] }) # 月度统计:对所有数值列统计 monthly_stats = df.resample('M').agg(['mean', 'max', 'min']) # 周度统计 weekly_stats = df.resample('W').agg(['mean', 'max', 'min']) # 日度统计 daily_stats = df.resample('D').agg(['mean', 'max', 'min'])
方法2:用groupby结合索引属性
适合需要更灵活分组规则的场景:
# 按年份分组统计所有数值列 yearly_group = df.groupby(df.index.year).agg(['mean', 'max', 'min']) # 按「年份+月份」分组(比如2023年1月、2024年1月分开统计) year_month_group = df.groupby([df.index.year, df.index.month]).agg(['mean', 'max', 'min'])
常见坑提醒
- 如果你的日期格式比较特殊(比如
dd/mm/yyyy HH:MM),一定要在pd.to_datetime里加format参数,避免解析错误。 - 不要把索引再转回列(除非必要),时间索引是Pandas处理时间序列的核心优势,保留它能简化后续所有统计操作。
内容的提问来源于stack exchange,提问作者Steph Bredenhann
相关产品推荐
相关产品推荐

