将两列转换为datetime.datetime格式时出现问题

时间:2018-12-13 17:51:55

标签: pandas timestamp datetime-format

此刻,我已编写了将数据框的两列从字符串更改为datetime.datetime对象的代码,类似于以下内容:

def converter(date):
    date = dt.strptime(date, '%m/%d/%Y %H:%M:%S')
    return date

df = pd.DataFrame({'A':['12/31/9999 0:00:00','1/1/2018 0:00:00'],
                   'B':['4/1/2015 0:00:00','11/1/2014 0:00:00']})

df['A'] = df['A'].apply(converter)
df['B'] = df['B'].apply(converter)

当我运行这段代码并打印数据框时,它就会像这样

                     A          B
0  9999-12-31 00:00:00 2015-04-01
1  2018-01-01 00:00:00 2014-11-01

当我检查每一列的数据类型时,它们会读取

A            object
B    datetime64[ns]

但是当我检查第一行的实际单元格的格式时,它们显示为

<class 'datetime.datetime'>
<class 'pandas._libs.tslib.Timestamp'>

经过试验后,我认为由于列“ A”中的日期为“ 12/31/9999 0:00:00”,我遇到了超出范围的错误,这导致该列被转换为datetime.datetime对象。我的问题是如何将数据框的“ B”列也转换为datetime.datetime对象,以便可以对类似于

的列进行查询
df.query('A > B')

没有出现错误或错误的输出。

预先感谢

1 个答案:

答案 0 :(得分:2)

由于'9999'只是一个虚拟年份,因此您可以通过选择一个有界的虚拟年份(或根据实际数据更有意义的虚拟年份)来简化生活:

import pandas as pd

df.replace('9999', '2060', regex=True).apply(pd.to_datetime)

输出:

           A          B
0 2060-12-31 2015-04-01
1 2018-01-01 2014-11-01

A    datetime64[ns]
B    datetime64[ns]
dtype: object

正如@coldspeed指出的,最好删除那些不好的日期:

df.apply(pd.to_datetime, errors='coerce')
#           A          B
#0        NaT 2015-04-01
#1 2018-01-01 2014-11-01