如何在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
相关产品推荐
相关产品推荐

