如何为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
formatif 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 usedayfirstalongside this.
- passing
正确解决方案
核心思路是先将字符串转为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
相关产品推荐
相关产品推荐

