如何在DataFrame中生成跨年不重置的连续日期序号dayNo?
实现连续递增的dayNo列
这里有两种简洁的实现方式,根据你的场景选择:
方法一:基于年份偏移量(通用,支持多年份)
如果你的数据可能扩展到更多年份,或者年份不连续,可以通过计算每个年份的累计前序年份总天数来生成连续的dayNo:
# 确保TradeDate是datetime类型 df['TradeDate'] = pd.to_datetime(df['TradeDate'], dayfirst=True) # 提取年份和当年天数 df['year'] = df['TradeDate'].dt.year df['day_of_year'] = df['TradeDate'].dt.day_of_year # 计算各年份的累计偏移量:前序所有年份的总天数之和 sorted_years = sorted(df['year'].unique()) year_offset = {} total_days = 0 for year in sorted_years: year_offset[year] = total_days # 自动获取当年总天数,处理闰年 total_days += pd.Period(year).days_in_year # 生成连续的dayNo df['dayNo'] = df.apply(lambda row: row['day_of_year'] + year_offset[row['year']], axis=1) # 可选:删除中间辅助列 df.drop(['year', 'day_of_year'], axis=1, inplace=True)
方法二:基于基准日期的天数差(简洁,适合连续两年)
如果你的数据只有2022和2023连续两年,直接计算每个日期与2022年1月1日的天数差,再加1即可:
# 转换日期列 df['TradeDate'] = pd.to_datetime(df['TradeDate'], dayfirst=True) # 设定基准日期为2022年1月1日 base_date = pd.to_datetime('2022-01-01') # 计算连续dayNo:基准日为第1天,2023年1月1日自动为366 df['dayNo'] = (df['TradeDate'] - base_date).dt.days + 1
说明
- 方法二无需手动处理闰年,pandas会自动计算日期差,代码更简洁高效。
- 方法一适合数据包含非连续年份或未来扩展更多年份的场景,灵活性更强。
内容的提问来源于stack exchange,提问作者K.Best
相关产品推荐
相关产品推荐

