我对我查询的数据库具有只读访问权限,并使用pymssql将其读入Pandas数据框。变量之一包含日期,其中一些日期存储为0001年1月1日午夜(即0001-01-01 00:00:00.0000000)。我不知道为什么要包括这些日期-据我所知,SQL Server无法将它们识别为有效日期,并且它们可能是由于某些默认数据输入所致。但是,这就是我必须处理的。可以将其重新创建为数据框,如下所示:
import numpy as np
import pandas as pd
tempDF = pd.DataFrame({ 'id': [0,1,2,3,4],
'date': ['0001-01-01 00:00:00.0000000',
'2015-05-22 00:00:00.0000000',
'0001-01-01 00:00:00.0000000',
'2015-05-06 00:00:00.0000000',
'2015-05-03 00:00:00.0000000']})
数据框如下所示:
print(tempDF)
date id
0 0001-01-01 00:00:00.0000000 0
1 2015-05-22 00:00:00.0000000 1
2 0001-01-01 00:00:00.0000000 2
3 2015-05-06 00:00:00.0000000 3
4 2015-05-03 00:00:00.0000000 4
...具有以下dtypes:
print(tempDF.dtypes)
date object
id int64
dtype: object
print(tempDF.dtypes)
但是,我通常使用以下命令将数据框中的日期字段转换为datetime格式:
tempDF['date'] = pd.to_datetime(tempDF['date'])
但是,偶然地,我注意到0001-01-01的日期已转换为2001-01-01。
print(tempDF)
date id
0 2001-01-01 0
1 2015-05-22 1
2 2001-01-01 2
3 2015-05-06 3
4 2015-05-03 4
我意识到原始数据库中的日期是不正确的,因为SQL Server不会将0001-01-01视为有效日期。但是至少在0001-01-01格式下,这样的丢失数据很容易在我的Pandas数据框中识别出来。但是,当pandas.to_datetime()更改这些日期,使其位于可行范围内时,很容易错过此类异常值。
如何确保pd.to_datetime不会错误地解释离群日期?
最佳答案
如果您提供format
,那么这些日期将不会被识别:
In [92]: pd.to_datetime(tempDF['date'], format="%Y-%m-%d %H:%M:%S.%f", errors='coerce')
Out[92]:
0 NaT
1 2015-05-22
2 NaT
3 2015-05-06
4 2015-05-03
Name: date, dtype: datetime64[ns]
默认情况下,它将出错,但是通过传递
errors='coerce'
,它们将被转换为NaT值(较早的 Pandas 版本为coerce=True
)。Pandas 将这些“0001-01-01”日期转换为“2001-01-01”而不提供
format
的原因是,这是dateutil
的行为:In [32]: import dateutil
In [33]: dateutil.parser.parse("0001-01-01")
Out[33]: datetime.datetime(2001, 1, 1, 0, 0)
关于python - 如何防止pandas.to_datetime()函数将0001-01-01转换为2001-01-01,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35391711/