use*_*097 6 python datetime dataframe pandas
我对数据库进行只读访问,我使用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']})
Run Code Online (Sandbox Code Playgroud)
数据框如下所示:
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
Run Code Online (Sandbox Code Playgroud)
...使用以下dtypes:
print(tempDF.dtypes)
date object
id int64
dtype: object
print(tempDF.dtypes)
Run Code Online (Sandbox Code Playgroud)
但是,我经常使用以下方法将数据框中的日期字段转换为日期时间格式:
tempDF['date'] = pd.to_datetime(tempDF['date'])
Run Code Online (Sandbox Code Playgroud)
但是,我偶然发现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
Run Code Online (Sandbox Code Playgroud)
我意识到原始数据库中的日期不正确,因为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]
Run Code Online (Sandbox Code Playgroud)
默认情况下它会出错,但通过传递errors='coerce',它们会转换为NaT值(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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |