如何重置dataframe日期列的月度日期序号,使每月从1日开始连续计数
实现方案
基于Pandas实现该需求的核心逻辑是按年月分组后,对组内的日期做因子化编码,相同日期对应相同编码,编码结果加1后作为新的日期号,再和年月拼接得到最终结果,具体代码如下:
首先导入依赖并初始化数据:
import pandas as pd # 构造示例数据,实际使用时替换为你自己的DataFrame df = pd.DataFrame({ 'Date': ['2017-05-13', '2017-05-13', '2017-05-13', '2017-05-14', '2017-05-14', '2017-05-15', '2017-07-02', '2017-07-03', '2017-07-03', '2017-07-04', '2018-01-14'] }) # 将Date列转换为datetime类型,若你的数据已经是日期类型可跳过该步 df['Date'] = pd.to_datetime(df['Date'])
核心处理逻辑:
# 提取每个日期对应的年月首日作为分组键 df['year_month'] = df['Date'].dt.to_period('M').dt.to_timestamp() # 按年月分组,对组内日期做因子化处理,相同日期得到相同序号,序号从1开始作为新的日期号 df['new_day'] = df.groupby('year_month')['Date'].transform(lambda x: pd.factorize(x)[0] + 1) # 拼接年月和新的日期号得到最终日期 df['Date'] = df.apply(lambda x: x['year_month'].replace(day=x['new_day']), axis=1) # 清除辅助计算列 df = df.drop(columns=['year_month', 'new_day'])
兼容场景说明
如果你的原始数据中同月份的日期不是按时间先后顺序排列,同时需要保证序号按日期的自然时间递增,可以将分组内的计算逻辑替换为以下写法:
df['new_day'] = df.groupby('year_month')['Date'].transform( lambda x: pd.factorize(x.sort_values())[0].reindex(x.index) + 1 )
内容的提问来源于stack exchange,提问作者NewJ
相关产品推荐
相关产品推荐

