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

如何实现日期转对应当月/下月1号?含12月跨年处理

问题修复与解决方案

原代码的问题

  1. 使用apply(axis=1)时,函数接收的是单行数据,不是整列的DatetimeSeries,所以不能用.dt访问器提取日/月/年,得直接处理单个日期值。
  2. 条件判断里用了&(位运算符),单个值的逻辑判断应该用and。
  3. else返回字符串'ERROR',会导致结果列混合日期和字符串类型,引发类型混乱问题。

修复后的逐行处理函数

先确保你的Date列已经转为datetime类型:

import datetime
import pandas as pd

# 先把Date列转成datetime类型(如果还没转的话)
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')

def Del_Date(row):
    date = row['Date']
    day = date.day
    month = date.month
    year = date.year
    
    if day <= 15:
        return datetime.date(year, month, 1)
    else:
        # 处理下月1号,12月自动转下一年1月
        if month == 12:
            return datetime.date(year + 1, 1, 1)
        else:
            return datetime.date(year, month + 1, 1)

# 应用函数生成目标列
df['Del_Date'] = df.apply(Del_Date, axis=1)
# 可选:把Del_Date转回datetime类型(适配后续数据操作)
df['Del_Date'] = pd.to_datetime(df['Del_Date'])

更高效的矢量化实现(推荐)

逐行apply在数据量大时效率极低,用pandas的矢量化操作能大幅提升速度,且代码更简洁:

import pandas as pd

# 确保Date列是datetime类型
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')

# 先生成所有日期对应的当月1日
df['Del_Date'] = df['Date'] + pd.offsets.MonthBegin(-1)

# 对16号及以后的日期,将日期偏移到下月1日(自动处理12月转下一年的情况)
mask = df['Date'].dt.day >= 16
df.loc[mask, 'Del_Date'] = df.loc[mask, 'Del_Date'] + pd.offsets.MonthBegin(1)

# 可选:按示例格式输出日期
df['Del_Date'] = df['Del_Date'].dt.strftime('%d/%m/%Y')

验证结果

运行后你的DataFrame会和示例完全匹配:

DateDel_Date
2018-12-1401/12/2018
2018-12-1501/12/2018
2018-12-1601/01/2019
2018-12-3101/01/2019
2019-01-0101/01/2019
2019-01-1501/01/2019
2019-01-1601/02/2019

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:31:08