为什么我会收到“ValueError: NaTType 不支持 strftime”,即使它不是空的?

cat*_*s25 7 python datetime pandas

如果我错了,请原谅我,但是ValueError: NaTType does not support strftime当数据为空或为空时会发生AFAIK 。但我的数据不是。

假设我有这个数据框。

df = pd.DataFrame({'personnel_number': ['123', '345', '567', '789', '000', '4444'],
                 'expiry_date': ['2020-12-07', '2099-12-04', '2019-08-30', '2022-03-19', '2020-09-06', '9999-12-31']})
Run Code Online (Sandbox Code Playgroud)

我想使用以下代码将其转换为日期类型格式。

for exp_date in df['expiry_date']:
    date = pd.to_datetime(exp_date, errors='coerce').strftime('%Y-%m-%d')
    print(date)
Run Code Online (Sandbox Code Playgroud)

但是当循环到达最后一个数据('9999-12-31'日期一)时,我总是以某种方式得到这个错误。

ValueError: NaTType does not support strftime
Run Code Online (Sandbox Code Playgroud)

我认为 9999 年听起来不合理,但这是我拥有的数据,我无法更改它。那么,我能做什么?

jez*_*ael 13

我认为这里的循环是没有必要的,pd.to_datetime与column一起使用然后Series.dt.strftime

df['expiry_date'] = pd.to_datetime(df['expiry_date'], errors='coerce').dt.strftime('%Y-%m-%d')
print(df)
  personnel_number expiry_date
0              123  2020-12-07
1              345  2099-12-04
2              567  2019-08-30
3              789  2022-03-19
4              000  2020-09-06
5             4444         NaT
Run Code Online (Sandbox Code Playgroud)

错误的原因是参数为日期时间errors='coerce'创建缺失值,因为这里超出了限制,时间戳限制NaT'wrong'

In [92]: pd.Timestamp.min
Out[92]: Timestamp('1677-09-21 00:12:43.145225')

In [93]: pd.Timestamp.max
Out[93]: Timestamp('2262-04-11 23:47:16.854775807')
Run Code Online (Sandbox Code Playgroud)