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

如何计算含NaT的两个datetime数组的平均小数年份?

计算两个Datetime数组的平均小数年份

实现思路

先将每个Datetime值转换为小数年份(比如2009-07-03转换为2009 + 当年已过天数/当年总天数),再按照规则计算对应索引的平均值:

  • 单个值为NaT(转换后为NaN)时,取非空值
  • 两个均为NaT时,返回NaN
  • 均非空时,取两者的平均值

完整代码实现

import pandas as pd
import numpy as np

# 1. 定义向量化的小数年份转换函数(效率远高于逐行apply)
def vec_datetime_to_decimal_year(dt_series):
    # 获取每个日期的年份
    year = dt_series.dt.year
    # 构造当年的起始和结束时间
    year_start = pd.to_datetime(year.astype(str) + "-01-01")
    year_end = pd.to_datetime((year + 1).astype(str) + "-01-01")
    # 计算当年总天数和日期已过天数
    total_days = (year_end - year_start).dt.days
    elapsed_days = (dt_series - year_start).dt.days
    # 返回小数年份
    return year + elapsed_days / total_days

# 2. 构造示例数据(替换为你的实际数组)
s1 = pd.Series([pd.Timestamp('2009-07-03'), pd.Timestamp('2009-07-03'), pd.Timestamp('2009-07-03'),
                pd.Timestamp('2003-02-07'), pd.Timestamp('2004-04-09'), pd.NaT],
               index=range(6))
s2 = pd.Series([pd.NaT, pd.NaT, pd.Timestamp('2015-04-12'),
                pd.Timestamp('2013-09-17'), pd.Timestamp('2014-02-19'), pd.NaT],
               index=range(6))

# 3. 将两个Datetime数组转换为小数年份
s1_decimal = vec_datetime_to_decimal_year(s1)
s2_decimal = vec_datetime_to_decimal_year(s2)

# 4. 按规则计算平均小数年份
average_decimal = pd.DataFrame({"s1": s1_decimal, "s2": s2_decimal}).mean(axis=1, skipna=True)

# 查看结果
print(average_decimal)

代码说明

  1. 小数年份转换:采用向量化计算,避免逐行遍历,处理大规模数据时效率提升明显。
  2. 平均值计算:利用DataFrame.mean(axis=1, skipna=True)自动适配规则:
    • 仅单个值非空时,直接返回该值
    • 两个值均非空时,返回算术平均值
    • 两个值均为空时,返回NaN(对应原数组的NaT)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:07:43