首页 > 解决方案 > 用 two_datetime 转换两种格式的时间戳

问题描述

我有一个数据集,其中时间戳有两种不同的格式...... Tue Oct 30 12:57:49 +0000 2012Tue Mar 11 13: 57: 22 +0000 2014 想将它们解析为 pd.datetime 格式。

到目前为止,我的方法是解析一种类型(使用 errors='ignore' 以便不触及不匹配的时间戳),然后用另一种格式解析第二次。

train['timestamp'] = pd.to_datetime(train['timestamp'], format='%a %b %d %H: %M: %S %z %Y', errors='ignore')
train['timestamp'] = pd.to_datetime(train['timestamp'], format='%a %b %d %H:%M:%S %z %Y')

在第二次调用时间戳时,我似乎遇到了一个错误,我本以为会被第一个表达式“拾取”:

ValueError: time data 'Tue Mar 11 23: 59: 22 +0000 2014' does not match format '%a %b %d %H:%M:%S %z %Y' (match)

我原以为Tue Mar 11 23: 59: 22 +0000 2014%a %b %d %H: %M: %S %z %Y在第一行匹配,所以第二行不会以这种格式显示。

标签: pythonpandas

解决方案


通过查看这两个调用的输出,我们可以看到解析工作正常,但是 pandas 在获取混合数据时会将时间戳对象转换回字符串(时间戳表示成功,str 表示错误)

import pandas as pd
data1 = {
'timestamp':  ['Tue Oct 30 12:57:49 +0000 2012','Tue Mar 11 13: 57: 22 +0000 2014']
}
train = pd.DataFrame.from_dict(data1)

list(map(type, pd.to_datetime(train['timestamp'], format='%a %b %d %H: %M: %S %z %Y', errors='ignore'))) #=> ['str','str']

通过运行,我们可以看到解析工作正常:

pd.to_datetime(train['timestamp'], format='%a %b %d %H: %M: %S %z %Y', errors='coerce') 

其中一个失败,一个成功(并返回 NaT)

解决方案是使用以下方法转换为相同的格式:

pd.to_datetime(train['timestamp'].str.replace(' ',''), format='%a%b%d%H:%M:%S%z%Y')

或运行两个单独的解析并组合:

t1 = pd.to_datetime(train['timestamp'], format='%a %b %d %H: %M: %S %z %Y', errors='coerce')
t2 = pd.to_datetime(train['timestamp'], format='%a %b %d %H:%M:%S %z %Y', errors='coerce')
train['timestamp'] = t1.combine_first(t2)

推荐阅读