Python DataFrame中混合格式日期(Python datetime与Excel日期序列号)转换为统一Python datetime格式的问题求助
Python DataFrame中混合格式日期(Python datetime与Excel日期序列号)转换为统一Python datetime格式的问题求助
嘿,我来帮你搞定这个日期转换的问题!你的Expense_Date列混合了字符串格式的日期和Excel的日期序列号,之前的代码逻辑有几个小问题导致try块没执行,我先帮你梳理下问题,再给你提供两种可行的解决方案:
先说说你之前代码的问题
- import位置不合理:把
import datetime as dt放在函数内部不符合Python规范,而且每次调用函数都会重复导入,应该移到文件开头。 - try块逻辑有误:你把整个Series丢进列表推导式,只要有一个元素是字符串,
ts.astype(int)就会报错,直接触发except块,没法单独处理每个元素。 - except块违背目标:你用
strftime把datetime转成了字符串,这样最终得到的是字符串类型,不是你想要的datetime格式。
方案一:逐元素判断处理(逻辑清晰,适合小数据量)
这个方法会逐个检查每个日期值的类型,分别处理字符串日期和Excel序列号:
首先导入需要的库:
import pandas as pd import datetime as dt
然后定义处理单个日期值的函数:
def convert_to_datetime(date_val): # 先处理Excel日期序列号(数字类型) if isinstance(date_val, (int, float)): return dt.datetime(1899, 12, 30) + pd.Timedelta(days=int(date_val)) # 再处理字符串格式的日期 try: return pd.to_datetime(date_val) except ValueError: # 遇到无法转换的异常值,返回pandas的缺失日期标记NaT return pd.NaT
最后把函数应用到目标列上:
df['Formatted_Date'] = df['Expense_Date'].apply(convert_to_datetime)
方案二:批量处理(效率更高,适合大数据量)
如果你的DataFrame数据量很大,逐元素apply效率会偏低,推荐用批量转换+掩码处理的方式:
import pandas as pd import datetime as dt # 第一步:尝试直接转换所有日期,无法转换的(比如Excel序列号)会变成NaT df['Formatted_Date'] = pd.to_datetime(df['Expense_Date'], errors='coerce') # 第二步:筛选出"转换失败且是数字"的行(也就是Excel序列号) mask = df['Formatted_Date'].isna() & df['Expense_Date'].apply(lambda x: isinstance(x, (int, float))) # 第三步:对这些行进行Excel日期转换 df.loc[mask, 'Formatted_Date'] = df.loc[mask, 'Expense_Date'].apply( lambda x: dt.datetime(1899, 12, 30) + pd.Timedelta(days=int(x)) )
验证你的示例数据
用你的测试数据验证的话:
45023会转换为2023-01-0145047会转换为2023-01-25- 其他字符串日期会直接转为标准的datetime格式
最终Formatted_Date列会统一为pandas的datetime64[ns]类型,也就是你需要的Python datetime格式啦~
备注:内容来源于stack exchange,提问作者user1499187




