如何计算NDRE与NDVI的月度平均值?(日期解析报错解决)
问题:计算NDRE和NDVI的月度平均值
数据集
data = { 'farm_Id': ['farm_258', 'farm_344', 'farm_345', 'farm_346', 'farm_348'], '2018-12-16_NDRE': [0.406, 0.380, 0.449, 0.432, 0.407], '2018-12-16_NDVI': [0.581, 0.552, 0.619, 0.573, 0.549], '2018-12-21_NDRE': [0.417, 0.270, 0.387, 0.403, 0.377], '2018-12-21_NDVI': [0.605, 0.416, 0.567, 0.555, 0.532], '2018-12-26_NDRE': [0.338, 0.191, 0.267, 0.252, 0.219], '2018-12-26_NDVI': [0.480, 0.285, 0.381, 0.324, 0.308], '2018-12-31_NDRE': [0.411, 0.202, 0.411, 0.463, 0.345], '2018-12-31_NDVI': [0.592, 0.294, 0.588, 0.622, 0.508], '2019-01-05_NDRE': [0.378, 0.207, 0.431, 0.495, 0.321], '2019-01-05_NDVI': [0.576, 0.293, 0.621, 0.668, 0.432], }
原代码及报错
尝试用以下代码计算月度平均值时,出现日期格式解析错误:
import pandas as pd df = pd.DataFrame(data) df.set_index('farm_Id', inplace=True) # Extract the month from column names df.columns = pd.to_datetime(df.columns, format='%Y-%m-%d').strftime('%Y-%m-%d') # Group by month and calculate the mean monthly_average = df.groupby(df.columns, axis=1).mean() # Print the result monthly_average
报错信息:
Error: time data "2018-12-16_NDRE" at position 0 doesn't match format specified
错误原因
列名包含_NDRE/_NDVI后缀,直接用pd.to_datetime以%Y-%m-%d格式解析整个列名,无法匹配格式规则,导致解析失败。
正确实现方法
先拆分列名,提取纯日期部分和指标类型,通过多级索引区分维度,再按农场、月份、指标分组计算均值:
import pandas as pd # 加载数据集 df = pd.DataFrame(data) df.set_index('farm_Id', inplace=True) # 拆分列名为日期和指标类型,生成多级列索引(区分日期和NDRE/NDVI) df.columns = pd.MultiIndex.from_tuples( [(pd.to_datetime(col.split('_')[0]), col.split('_')[1]) for col in df.columns], names=['date', 'indicator'] ) # 转换为长格式,按农场、月份、指标分组计算月度均值 monthly_avg = df.stack('indicator').groupby( [pd.Grouper(level='farm_Id'), pd.Grouper(level='date', freq='M'), pd.Grouper(level='indicator')] ).mean() # 转换为宽格式,更直观展示结果 monthly_avg_wide = monthly_avg.unstack(['indicator', 'date']) print(monthly_avg_wide)
扩展:计算所有农场的月度整体均值
如果不需要按农场拆分,可去掉farm_Id分组条件:
overall_monthly_avg = df.stack('indicator').groupby( [pd.Grouper(level='date', freq='M'), pd.Grouper(level='indicator')] ).mean() print(overall_monthly_avg)
内容的提问来源于stack exchange,提问作者rekha
相关产品推荐
相关产品推荐

