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

如何为pandas.core.series.Series对象中的日和月补前导零

日期格式转换问题:补全日/月的前导零

我有一个大型数据集,其中月份和日期没有前导零。处理datetime类型时要求日和月必须带前导零,原始日期格式为1/1/2023,需要转换为01/01/2023。尝试过以下方法均报错:

  • 方法1:尝试用整数补零的格式化方法print("{:02d}".format(number)),但该方法仅对整数有效,无法直接处理日期字符串。
  • 方法2:执行代码:
    merged_dfs["Date"] = merged_dfs.apply(lambda x: "{month:02}-{day:02}-{year}".format(month=x.month,day=x.day,year=x.year))
    
    报错:AttributeError: 'Series' object has no attribute 'month'
  • 方法3:执行代码:
    merged_dfs['Date'] = merged_dfs.ts_placed.map(lambda x: '{year}-{month:02}'.format(year=x.year,month=x.month))
    
    报错:AttributeError: 'DataFrame' object has no attribute 'ts_placed'
  • 方法4:执行代码:
    merged_dfs["Date"] = pd.to_datetime(merged_dfs["Date"], format="%-d-%-m-%Y")
    
    报错:ValueError: '-' is a bad directive in format '%-d-%-m-%Y'
  • 方法5:执行代码:
    merged_dfs["Date"]=merged_dfs["Date"].apply(pd.to_datetime, format="%d-$m-%Y")
    
    报错:

    ValueError: time data "1/1/2023" doesn't match format "%d-$m-%Y", at position 0. You might want to try:

    • passing format if your strings have a consistent format;
    • passing format='ISO8601' if your strings are all ISO8601 but not necessarily in exactly the same format;
    • passing format='mixed', and the format will be inferred for each element individually. You might want to use dayfirst alongside this.

正确解决方案

核心思路是先将字符串转为datetime对象,再格式化为带前导零的目标字符串:

1. 转换为datetime对象

根据原始日期的顺序(月/日/年 或 日/月/年)选择对应方式:

import pandas as pd

# 情况1:原始格式为 月/日/年
merged_dfs["Date"] = pd.to_datetime(merged_dfs["Date"], format="%m/%d/%Y")

# 情况2:原始格式为 日/月/年,需指定dayfirst=True
merged_dfs["Date"] = pd.to_datetime(merged_dfs["Date"], format="%d/%m/%Y", dayfirst=True)

# 格式统一时也可自动识别
merged_dfs["Date"] = pd.to_datetime(merged_dfs["Date"])

2. 格式化为带前导零的字符串

用dt.strftime方法输出目标格式:

# 输出 月/日/年 格式(如01/01/2023)
merged_dfs["Date"] = merged_dfs["Date"].dt.strftime("%m/%d/%Y")

# 输出 日/月/年 格式(如01/01/2023)
merged_dfs["Date"] = merged_dfs["Date"].dt.strftime("%d/%m/%Y")

完整示例

import pandas as pd

# 模拟数据集
data = {"Date": ["1/1/2023", "12/5/2023", "3/15/2023"]}
merged_dfs = pd.DataFrame(data)

# 转换+格式化
merged_dfs["Date"] = pd.to_datetime(merged_dfs["Date"], format="%m/%d/%Y").dt.strftime("%m/%d/%Y")
print(merged_dfs)

输出结果:

Date
0  01/01/2023
1  12/05/2023
2  03/15/2023

错误原因分析

  • 方法2:apply默认按列处理,x是Series对象而非datetime元素,需针对Date列单独处理并先转datetime。
  • 方法3:数据集中不存在ts_placed列,属于列名错误。
  • 方法4:%-d是Linux专属的strftime语法,Windows不支持,且原始日期用/分隔而非-。
  • 方法5:格式字符串写错,$m是无效指令,且分隔符与原始数据的/不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:21:20