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

Python中如何生成忽略闰年闰日的day_of_year列?

解决Pandas中忽略闰年规则计算日序的问题

因为你已经删除了所有闰日,所有日期都是非闰年中存在的有效日期,以下几种方法可以实现让3月1日对应日序60的需求:

方法一:映射到固定非闰年计算dayofyear

将所有日期的年份替换为一个固定的非闰年(比如2023),再调用Pandas的dayofyear属性,这样就会按照非闰年的规则计算日序:

import pandas as pd

# 假设你的时间戳列名为'date',数据框为df
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
# 替换年份为非闰年2023
non_leap_date = df['date'].apply(lambda dt: dt.replace(year=2023))
df['day_of_year'] = non_leap_date.dt.dayofyear

方法二:计算与当年1月1日的天数差

直接计算每个日期和当年1月1日的间隔天数,再加1就是正确的日序(因为已经移除闰日,每年都是365天,不会有偏移):

import pandas as pd

df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
# 生成每个日期对应的当年1月1日
df['year_start'] = pd.to_datetime(df['date'].dt.year.astype(str) + '-01-01')
# 计算日序:天数差 + 1
df['day_of_year'] = (df['date'] - df['year_start']).dt.days + 1
# 清理临时列
df.drop('year_start', axis=1, inplace=True)

方法三:自定义月日累加计算

预先定义非闰年各月的天数,通过月份和日期直接累加计算日序,逻辑更直观:

import pandas as pd

# 非闰年各月份的天数
non_leap_month_days = [31,28,31,30,31,30,31,31,30,31,30,31]
# 生成各月份起始的累计天数(比如1月起始为0,2月起始为31,以此类推)
cumulative_days = [0] + [sum(non_leap_month_days[:i]) for i in range(1, 13)]

def calculate_day_of_year(dt):
    return cumulative_days[dt.month - 1] + dt.day

df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
df['day_of_year'] = df['date'].apply(calculate_day_of_year)

以上三种方法都能满足你的需求,其中前两种方法代码简洁,适合处理大型数据集;第三种方法逻辑清晰,便于理解计算过程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:40:31