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

如何在Pandas中统一转换混合格式时间戳为可读日期?

问题

我有一个包含多种时间戳格式的列,示例数据如下,希望将该列转换为可读日期。由于时间戳单位混合,部分数据转换正常,但部分数据默认转为1970年的日期。请问是否可以统一转换这些数据,或者先将它们转换为统一的Unix时间戳单位,再转为可读日期?

示例代码:

data = ["2022-04-14 17:31:03.023","2022-04-20 12:49:50.295",1647597943249,1647519101441,"2022-03-19 18:10:59.024"]
df = pd.DataFrame(data, columns=['date'])
df['newdate'] = pd.to_datetime(df['date'], unit='ns')
df

执行后结果:

date                     newdate
0   2022-04-14 17:31:03.023  2022-04-14 17:31:03.023000
1   2022-04-20 12:49:50.295  2022-04-20 12:49:50.295000
2   1647597943249            1970-01-01 00:27:27.597943249
3   1647519101441            1970-01-01 00:27:27.519101441
4   2022-03-19 18:10:59.024  2022-03-19 18:10:59.024000

若将unit参数改为'ms',则会触发如下错误:

ValueError: non convertible value 2022-04-14 17:31:03.023 with the unit 'ms'.
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/pandas/_libs/tslib.pyx in pandas._libs.tslib.array_with_unit_to_datetime()

ValueError: could not convert string to float: '2022-04-14 17:31:03.023'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
4 frames
/usr/local/lib/python3.7/dist-packages/pandas/_libs/tslib.pyx in pandas._libs.tslib.array_with_unit_to_datetime()

ValueError: non convertible value 2022-04-14 17:31:03.023 with the unit 'ms'
解决方案

可以通过区分数据类型分别处理的方式解决这个问题,以下是两种实用实现方法:

方法1:自定义转换函数(直观易读)

通过判断每个元素的类型,分别处理字符串日期和数值型时间戳:

import pandas as pd

data = ["2022-04-14 17:31:03.023","2022-04-20 12:49:50.295",1647597943249,1647519101441,"2022-03-19 18:10:59.024"]
df = pd.DataFrame(data, columns=['date'])

# 定义转换逻辑
def convert_date(x):
    if isinstance(x, str):
        return pd.to_datetime(x)
    elif isinstance(x, int):
        # 示例中数值为毫秒级时间戳,对应正常日期范围
        return pd.to_datetime(x, unit='ms')
    else:
        return pd.NaT  # 处理未知类型数据

df['newdate'] = df['date'].apply(convert_date)
print(df)

执行结果:

date                   newdate
0  2022-04-14 17:31:03.023 2022-04-14 17:31:03.023
1  2022-04-20 12:49:50.295 2022-04-20 12:49:50.295
2             1647597943249 2022-03-17 15:05:43.249
3             1647519101441 2022-03-16 14:51:41.441
4  2022-03-19 18:10:59.024 2022-03-19 18:10:59.024

方法2:两次批量转换(高效适合大数据)

先转换字符串格式,再处理未转换成功的数值型时间戳,避免逐行循环:

import pandas as pd

data = ["2022-04-14 17:31:03.023","2022-04-20 12:49:50.295",1647597943249,1647519101441,"2022-03-19 18:10:59.024"]
df = pd.DataFrame(data, columns=['date'])

# 第一步:转换字符串格式,转换失败的设为NaT
df['newdate'] = pd.to_datetime(df['date'], errors='coerce')
# 第二步:筛选出未转换成功的行,用毫秒级单位处理数值型时间戳
mask = df['newdate'].isna()
df.loc[mask, 'newdate'] = pd.to_datetime(df.loc[mask, 'date'], unit='ms')
print(df)

该方法和方法1结果一致,但在数据量较大时效率更高。


内容的提问来源于stack exchange,提问作者frankfrank-o

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:50:26