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

如何重置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 13:54:04