此刻,我已编写了将数据框的两列从字符串更改为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')
没有出现错误或错误的输出。
预先感谢
答案 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