stackoverflow社区大家好,
我想改变一个列的日期时间格式,但是我不工作,我不知道我做错了什么
执行以下代码后:
df6['beginn'] = pd.to_datetime(df6['beginn'], unit='s', errors='ignore')
我得到了这个输出,这很好,但是我想抽出一个小时只剩下%m/%d/%Y
。
ID DATE
91060 2017-11-10 00:00:00
91061 2022-05-01 00:00:00
91062 2022-04-01 00:00:00
Name: beginn, Length: 91063, dtype: object
我试过这个和许多其他的
df6['beginn'] = df6['beginn'].dt.strftime('%m/%d/%Y')
,得到如下输出:
AttributeError: Can only use .dt accessor with datetimelike values.
但是我不明白为什么,我用pd.to_datetime
转换了数据吗?
感谢你给我的任何提示!非常感谢!
您必须使用errors="ignore"
的原因是因为并非所有您正在解析的日期都是正确的格式。如果您使用errors="coerce"
,如@phi所提到的,那么任何不能转换的日期将被设置为NaT
。列的数据类型仍将转换为datatime64,然后您可以按照自己的喜好进行格式化,并根据需要处理NaT
。
Date
中有一个项目没有写成年/月/日(25月是错误的):
>>> df = pd.DataFrame({'ID': [91060, 91061, 91062, 91063], 'Date': ['2017/11/10', '2022/05/01', '2022/04/01', '2055/25/25']})
>>> df
ID Date
0 91060 2017/11/10
1 91061 2022/05/01
2 91062 2022/04/01
3 91063 2055/25/25
>>> df.dtypes
ID int64
Date object
dtype: object
使用errors="ignore"
:
>>> df['Date'] = pd.to_datetime(df['Date'], errors='ignore')
>>> df
ID Date
0 91060 2017/11/10
1 91061 2022/05/01
2 91062 2022/04/01
3 91063 2055/25/25
>>> df.dtypes
ID int64
Date object
dtype: object
列Date
仍然是一个对象,因为不是所有的值都被转换了。运行df['Date'] = df['Date'].dt.strftime("%m/%d/%Y")
将导致AttributeError
使用errors="coerce"
:
>>> df['Date'] = pd.to_datetime(df['Date'], errors='coerce')
>>> df
ID Date
0 91060 2017-11-10
1 91061 2022-05-01
2 91062 2022-04-01
3 91063 NaT
>>> df.dtypes
ID int64
Date datetime64[ns]
dtype: object
无效日期被设置为NaT,列现在的类型是datatime64,你现在可以格式化它:
>>> df['Date'] = df['Date'].dt.strftime("%m/%d/%Y")
>>> df
ID Date
0 91060 11/10/2017
1 91061 05/01/2022
2 91062 04/01/2022
3 91063 NaN
注意:当格式化datatime64时,它被转换回对象类型,因此NaT被更改为NaN。您遇到的问题是一些脏数据的格式不正确。