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

Python计算时间序列日平均:跳过2月29日并兼容不完整年份

实现日平均降雨量计算(跳过闰年2月29日,兼容不完整年份)

我来分享一个清晰的实现思路,用Python为例,完全贴合你的需求:

核心思路拆解

首先得明确目标:把所有有效日期(排除闰年2月29日)映射到平年的365天维度上,然后对每一天的降雨量取平均——哪怕你的数据只覆盖了部分年份,这个逻辑都能正常运转。

步骤1:给每个日期分配平年日索引

先写一个工具函数,把任意日期转换成平年对应的1-365日序数:

  • 平年日期直接取dayofyear
  • 闰年日期:如果是2月29日,标记为无效;如果是3月1日及以后,日序数减1(因为平年没有2月29日,闰年3月1日的dayofyear是60,对应平年的第59天,减1才能对齐平年的日期序列)

代码实现:

import datetime

def get_flat_year_day(dt):
    # 判断是否为闰年
    is_leap = dt.year % 4 == 0 and (dt.year % 100 != 0 or dt.year % 400 == 0)
    if is_leap:
        if dt.month == 2 and dt.day == 29:
            return None  # 跳过闰年2月29日
        elif dt >= datetime.date(dt.year, 3, 1):
            return dt.timetuple().tm_yday - 1
        else:
            return dt.timetuple().tm_yday
    else:
        return dt.timetuple().tm_yday

步骤2:分组计算日平均值

接下来把所有有效数据按平年日索引分组,计算每组的平均值,这里提供两种实现方式:

基础Python版本(适合小数据量)

假设你的X是datetime对象列表,rainfall是对应的降雨量列表:

from collections import defaultdict

# 用字典存储每一天的降雨量数据
daily_rain_data = defaultdict(list)

for dt, rain in zip(X, rainfall):
    day_idx = get_flat_year_day(dt)
    if day_idx is not None:  # 跳过无效的闰年2月29日数据
        daily_rain_data[day_idx].append(rain)

# 生成最终的日平均列表Z(长度固定为365)
Z = []
for day_idx in range(1, 366):
    if day_idx in daily_rain_data:
        # 计算该日的平均降雨量
        avg_rain = sum(daily_rain_data[day_idx]) / len(daily_rain_data[day_idx])
        Z.append(avg_rain)
    else:
        # 无数据的日期用NaN表示,你也可以改成0或其他默认值
        Z.append(float('nan'))

Pandas版本(适合大数据量,代码更简洁)

如果数据量较大,用Pandas处理效率更高:

import pandas as pd

# 把数据转换成DataFrame格式
df = pd.DataFrame({
    'date': X,
    'rainfall': rainfall
})

# 计算每个日期对应的平年日索引
df['flat_day'] = df['date'].apply(get_flat_year_day)

# 过滤掉闰年2月29日的数据
df = df.dropna(subset=['flat_day'])

# 分组计算平均值,重新索引到1-365并填充缺失值
daily_avg = df.groupby('flat_day')['rainfall'].mean().reindex(range(1, 366), fill_value=float('nan'))

# 转换成最终列表Z
Z = daily_avg.tolist()

兼容不完整年份的说明

这个方案天生支持不完整年份的数据:

  • 不管你的数据只覆盖1个月、11个月零15天,还是零散的几个年份,只要日期不是闰年2月29日,就会被正确映射到对应的平年日索引。
  • 如果某个平年日期在所有数据中都没有记录(比如从来没有12月31日的降雨量数据),Z中对应的位置会是NaN,你可以根据业务需求替换成0或者其他合理值。

额外注意点

  • 如果你的X不是datetime对象(比如是字符串格式的日期),需要先转换:例如datetime.datetime.strptime(x_str, '%Y-%m-%d'),具体格式根据你的日期字符串调整。
  • 如果你用其他编程语言(比如R、JavaScript),核心逻辑完全一致:先做日期到平年日索引的映射,再分组求平均。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:07:06