繁体   English   中英

熊猫to_datetime无法正常工作

[英]pandas to_datetime doesn't work as expected

我有一个df其条目主要是'yyyymmdd'日期字符串,但也有一些'nan'值。 请注意,这里的'nan'字符串,而不是float nan。 现在,我想将df中的所有日期字符串转换为pandas datetime格式,同时将nan值转换为NaNNaT等,无论pd.isnull可以检测到pd.isnull

立即想到可以将pd.to_datetime函数与errors参数一起使用。 如文档中所述,

errors : {'ignore', 'raise', 'coerce'} ,默认为'raise'
-如果'raise' ,则无效的解析将引发异常
-如果为'coerce' ,则无效解析将设置为NaT
-如果'ignore' ,则无效的解析将返回输入

因此,我尝试使用示例df

            001002.XY 600123.AB 123456.YZ 555555.GO
ipo_date     20100203  20150605       nan  20090501
delist_date       nan  20170801       nan       nan

其中所有值都是str ,甚至nan实际上都是'nan' 然后pd.to_datetime(df, errors='coerce')我尝试了pd.to_datetime(df, errors='coerce') ,这使我感到pd.to_datetime(df, errors='coerce')

Traceback (most recent call last):
  File "D:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-27-43c41318d6ab>", line 1, in <module>
    pd.to_datetime(df, errors='coerce')
  File "D:\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 512, in to_datetime
    result = _assemble_from_unit_mappings(arg, errors=errors)
  File "D:\Anaconda3\lib\site-packages\pandas\core\tools\datetimes.py", line 591, in _assemble_from_unit_mappings
    "[{0}] is missing".format(','.join(req)))
ValueError: to assemble mappings requires at least that [year, month, day] be specified: [day,month,year] is missing

但是,如果我尝试使用单个单元格,则效果很好:

pd.to_datetime(df.iloc[0, 0])
Out[33]: 
Timestamp('2010-02-03 00:00:00')
pd.to_datetime(df.iloc[1, 0])
Out[34]: 
NaT

我不知道发生了什么事。 值得一提的是,所有列的objectdtype

df.dtypes
Out[35]: 
001002.XY    object
600123.AB    object
123456.YZ    object
555555.GO    object
dtype: object

但这似乎不是罪魁祸首:我也对单独的列进行了测试,它们工作得很好:

pd.to_datetime(df.iloc[:, 0])
Out[36]: 
ipo_date      2010-02-03
delist_date          NaT
Name: 001002.XY, dtype: datetime64[ns]

有人可以帮忙或解释吗? 谢谢!

应该稍微做些不同-将pd.to_datetime应用于所有列:

In [6]: df.apply(pd.to_datetime, errors='coerce')
Out[6]:
             001002.XY  600123.AB 123456.YZ  555555.GO
ipo_date    2010-02-03 2015-06-05       NaT 2009-05-01
delist_date        NaT 2017-08-01       NaT        NaT

如果将DataFrame传递给pd.to_datetime() -它希望使用诸如(年,月,日和小时:分钟,秒)之类的列,以便合并来自不同列的日期时间。

文档

从DataFrame的多个列中组合一个日期时间。 键可以是常见的缩写,例如[ yearmonthdayminutesecondmsusns ])或多个相同的缩写

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM