Python中如何将DataFrame的数字列转换为日期格式
搞定DataFrame日期列的格式转换问题
先来唠唠你代码报错的原因:
- 你函数里循环的是
col_name(也就是列的名字,是个字符串),压根没遍历到列里的实际日期值!这就导致你判断len(col_name)的时候,其实是在看列名的长度,完全没碰数据,不报错才怪。 - 字符串切片的逻辑也错了,年份应该是每个日期字符串的最后四位,月份是前面剩下的部分,比如
"12018"最后四位是"2018",前面1位是"1";"102018"最后四位是"2018",前面2位是"10"。 - 你的函数最后只返回了最后一次循环的结果,根本没法处理整列的所有行。
下面给你两种实用的解决方案:
方法一:修正自定义函数+apply批量处理
先把函数改成处理单个日期值的逻辑,再用apply批量作用到列上:
import pandas as pd # 先构造你的示例数据 df = pd.DataFrame({ "Date": [12018, 102018, 32018, 122018, 112019, 32019, 42019] }) def adjust_date(date_val): # 先把数字转成字符串,方便切片操作 date_str = str(date_val) day = "01" # 年份取最后四位 year = date_str[-4:] # 月份取前面的部分,然后补前导零确保是两位(比如"1"变成"01") month = date_str[:-4].zfill(2) # 拼接成标准的YYYY-MM-DD格式,后续好转datetime return f"{year}-{month}-{day}" # 把函数应用到Date列,生成格式化后的列 df["Formatted_Date"] = df["Date"].apply(adjust_date) # 直接转成datetime格式,方便后续时间相关操作 df["Formatted_Date"] = pd.to_datetime(df["Formatted_Date"]) print(df)
运行后Formatted_Date列就是标准的datetime类型,完全符合你的需求。
方法二:用pandas矢量化操作(大数据集更高效)
如果你的数据量很大,用apply效率会有点低,直接用pandas的字符串批量操作更快:
import pandas as pd df = pd.DataFrame({ "Date": [12018, 102018, 32018, 122018, 112019, 32019, 42019] }) # 把数字转成字符串,提取年份和月份 date_str = df["Date"].astype(str) df["year"] = date_str.str[-4:] df["month"] = date_str.str[:-4].str.zfill(2) # 拼接成日期字符串并直接转成datetime df["Formatted_Date"] = pd.to_datetime(df["year"] + "-" + df["month"] + "-01") # 可以删掉中间生成的year和month列 df = df.drop(["year", "month"], axis=1) print(df)
这种方法利用pandas的矢量化特性,比循环快很多,适合处理几十万甚至上百万行的数据。
最终效果验证
处理后每个原始日期对应的结果是:
- 12018 → 2018-01-01
- 102018 → 2018-10-01
- 32018 → 2018-03-01
- 122018 → 2018-12-01
- 112019 → 2019-11-01
- 32019 → 2019-03-01
- 42019 → 2019-04-01
完美匹配你想要的datetime格式~
内容的提问来源于stack exchange,提问作者pathon
相关产品推荐
相关产品推荐

