首页 > 解决方案 > 将两列转换为 datetime.datetime 格式的问题

问题描述

我现在编写了代码,用于将我的数据框的两列从字符串更改为 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”,我遇到了越界错误,这导致该列被转换为日期时间。日期时间对象。我的问题是如何将我的数据框的“B”列转换为 datetime.datetime 对象,以便我可以在类似于以下的列上运行查询

df.query('A > B')

没有得到错误或错误的输出。

提前致谢

标签: pandastimestampdatetime-format

解决方案


由于'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

推荐阅读