You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python DataFrame中混合格式日期(Python datetime与Excel日期序列号)转换为统一Python datetime格式的问题求助

Python DataFrame中混合格式日期(Python datetime与Excel日期序列号)转换为统一Python datetime格式的问题求助

嘿,我来帮你搞定这个日期转换的问题!你的Expense_Date列混合了字符串格式的日期和Excel的日期序列号,之前的代码逻辑有几个小问题导致try块没执行,我先帮你梳理下问题,再给你提供两种可行的解决方案:

先说说你之前代码的问题

  1. import位置不合理:把import datetime as dt放在函数内部不符合Python规范,而且每次调用函数都会重复导入,应该移到文件开头。
  2. try块逻辑有误:你把整个Series丢进列表推导式,只要有一个元素是字符串,ts.astype(int)就会报错,直接触发except块,没法单独处理每个元素。
  3. 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-01
  • 45047会转换为2023-01-25
  • 其他字符串日期会直接转为标准的datetime格式

最终Formatted_Date列会统一为pandas的datetime64[ns]类型,也就是你需要的Python datetime格式啦~

备注:内容来源于stack exchange,提问作者user1499187

火山引擎 最新活动