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
相关产品推荐
相关产品推荐

