Python `to_datetime`和'parse_dates`都未能将数据类型转换为日期时间[ns]
我正在加载一些数据,其中包含Python `to_datetime`和'parse_dates`都未能将数据类型转换为日期时间[ns],python,pandas,datetime,Python,Pandas,Datetime,我正在加载一些数据,其中包含Date列。以下是复制的样本: Date Time Latitude Longitude 0 01/02/1965 13:44:18 19.246 145.616 1 01/04/1965 11:29:49 1.863 127.352 2 01/05/1965 18:05:58 -20.579 -173.972 3 01/08/1965 18:49:43
Date
列。以下是复制的样本:
Date Time Latitude Longitude
0 01/02/1965 13:44:18 19.246 145.616
1 01/04/1965 11:29:49 1.863 127.352
2 01/05/1965 18:05:58 -20.579 -173.972
3 01/08/1965 18:49:43 -59.076. -23.557
4 01/09/1965 13:32:50 11.938 126.427
使用withparse_dates=['Date']
加载此数据会导致Date
列的显示方式不同,但将类型保留为Object
:
Date Time Latitude Longitude
0 1965-01-02 00:00:00 13:44:18 19.246 145.616
1 1965-01-04 00:00:00 11:29:49 1.863 127.352
2 1965-01-05 00:00:00 18:05:58 -20.579 -173.972
3 1965-01-08 00:00:00 18:49:43 -59.076 -23.557
4 1965-01-09 00:00:00 13:32:50 11.938 126.427
import pandas as pd
data = pd.read_csv('data/database.csv', parse_dates=['Date'])
data.Date = data.Date.apply(pd.to_datetime)
data[data.Date.dt.year >= 1970]
AttributeError: Can only use .dt accessor with datetimelike value
df.info()
Data columns (total 21 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Date 23412 non-null object
如果在加载数据后使用pd.to\u datetime()
,也会发生同样的情况
问题是我不能在类型为对象的列/序列上使用.dt
属性:
Date Time Latitude Longitude
0 1965-01-02 00:00:00 13:44:18 19.246 145.616
1 1965-01-04 00:00:00 11:29:49 1.863 127.352
2 1965-01-05 00:00:00 18:05:58 -20.579 -173.972
3 1965-01-08 00:00:00 18:49:43 -59.076 -23.557
4 1965-01-09 00:00:00 13:32:50 11.938 126.427
import pandas as pd
data = pd.read_csv('data/database.csv', parse_dates=['Date'])
data.Date = data.Date.apply(pd.to_datetime)
data[data.Date.dt.year >= 1970]
AttributeError: Can only use .dt accessor with datetimelike value
如果Date
列的类型正确,则此操作正常工作。任何线索都值得欣赏。您可以将to_datetime()
方法中的错误
参数传递给to_datetime()
方法,并将其设置为等于“强制”,因此基本上,如果您的任何日期值的格式不是日期或to_datetime()
方法无法解析它们,则将这些值设置为NaT
,并继续进一步解析:-
data['Date']=pd.to_datetime(data['Date'],errors='coerce')
现在通过以下方式检查列的数据类型:-
data.dtypes
It will gives you:-
Date datetime64[ns]
Time object
Latitude object
Longitude float64
现在,当您看到日期列更改为“日期时间”时,您可以使用dt
类
最后:-
data[data['Date'].dt.year >= 1970]
pd.to_datetime(df['Date'])
应该可以工作。还有一个errors=
参数可以使用。你确定你所有的记录都是有效日期吗?@MattR不,我现在正在查看。我还注意到,访问Date
列的单个索引会导致timestamp
对象。我不知道这是不是一个线索。检查一下日期是否有不同的时区。如果是这种情况,请使用utc=True
选项。@QuangHoang数据中没有时区,但设置utc=True
确实解决了问题。谢谢,谢谢。我要试一试。你能详细解释一下这里发生了什么问题,需要额外使用errors
参数吗?当然……更新了……请看一看,很好,谢谢。我发现2.3万行中有3行的格式是这样的1975-02-23T02:58:41.000Z
,这肯定是在给工作带来麻烦。此外,@QuangHoang建议的utc=True
也解决了这个错误。