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

如何计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 07:40:04