to_datetime值错误:至少必须指定[年,月,日] Pandas

Jed*_*Jed 13 python csv datetime pandas

我正在阅读两个不同的CSV,每个CSV的列都有日期值.在read_csv之后我想用to_datetime方法将数据转换为datetime.每个CSV中日期的格式略有不同,虽然在to_datetime格式参数中记录并指定了差异,但是一个转换正常,而另一个返回以下值错误.

ValueError: to assemble mappings requires at least that [year, month, day] be sp
ecified: [day,month,year] is missing
Run Code Online (Sandbox Code Playgroud)

第一个dte.head()

0  10/14/2016  10/17/2016  10/19/2016    8/9/2016  10/17/2016   7/20/2016
1   7/15/2016   7/18/2016   7/20/2016    6/7/2016   7/18/2016   4/19/2016
2   4/15/2016   4/14/2016   4/18/2016   3/15/2016   4/18/2016   1/14/2016
3   1/15/2016   1/19/2016   1/19/2016  10/19/2015   1/19/2016  10/13/2015
4  10/15/2015  10/14/2015  10/19/2015   7/23/2015  10/14/2015   7/15/2015
Run Code Online (Sandbox Code Playgroud)

此数据帧使用以下代码进行转换:

dte = pd.to_datetime(dte, infer_datetime_format=True)
Run Code Online (Sandbox Code Playgroud)

要么

dte = pd.to_datetime(dte[x], format='%m/%d/%Y')
Run Code Online (Sandbox Code Playgroud)

第二个dtd.head()

0   2004-01-02 2004-01-02  2004-01-09 2004-01-16  2004-01-23  2004-01-30
1   2004-01-05 2004-01-09  2004-01-16 2004-01-23  2004-01-30  2004-02-06
2   2004-01-06 2004-01-09  2004-01-16 2004-01-23  2004-01-30  2004-02-06
3   2004-01-07 2004-01-09  2004-01-16 2004-01-23  2004-01-30  2004-02-06
4   2004-01-08 2004-01-09  2004-01-16 2004-01-23  2004-01-30  2004-02-06
Run Code Online (Sandbox Code Playgroud)

此csv不使用以下任何一种转换:

dtd = pd.to_datetime(dtd, infer_datetime_format=True)
Run Code Online (Sandbox Code Playgroud)

要么

dtd = pd.to_datetime(dtd, format='%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)

它返回上面的值错误.但有趣的是,使用parse_dates和infer_datetime_format作为read_csv方法的参数可以正常工作.这里发生了什么?

piR*_*red 11

你可以stack/ pd.to_datetime/unstack

pd.to_datetime(dte.stack()).unstack()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

解释
pd.to_datetime适用于字符串,列表或pd.Series.dte是一个pd.DataFrame,这就是你遇到问题的原因.dte.stack()产生pd.Series一个所有行堆叠在一起的aa.但是,在这种堆叠的形式中,因为它是一个pd.Series,我可以得到一个矢量化pd.to_datetime的工作.随后unstack只需将初始化反转stack即可获得原始形式dte


jez*_*ael 7

对我来说工程apply功能to_datetime:

print (dtd)
            1           2           3           4           5           6
0                                                                        
0  2004-01-02  2004-01-02  2004-01-09  2004-01-16  2004-01-23  2004-01-30
1  2004-01-05  2004-01-09  2004-01-16  2004-01-23  2004-01-30  2004-02-06
2  2004-01-06  2004-01-09  2004-01-16  2004-01-23  2004-01-30  2004-02-06
3  2004-01-07  2004-01-09  2004-01-16  2004-01-23  2004-01-30  2004-02-06
4  2004-01-08  2004-01-09  2004-01-16  2004-01-23  2004-01-30  2004-02-06


dtd = dtd.apply(pd.to_datetime)

print (dtd)
           1          2          3          4          5          6
0                                                                  
0 2004-01-02 2004-01-02 2004-01-09 2004-01-16 2004-01-23 2004-01-30
1 2004-01-05 2004-01-09 2004-01-16 2004-01-23 2004-01-30 2004-02-06
2 2004-01-06 2004-01-09 2004-01-16 2004-01-23 2004-01-30 2004-02-06
3 2004-01-07 2004-01-09 2004-01-16 2004-01-23 2004-01-30 2004-02-06
4 2004-01-08 2004-01-09 2004-01-16 2004-01-23 2004-01-30 2004-02-06
Run Code Online (Sandbox Code Playgroud)


小智 6

这个对我有用:

dtd.apply(lambda x: pd.to_datetime(x,errors = 'coerce', format = '%Y-%m-%d'))
Run Code Online (Sandbox Code Playgroud)

这样您就可以使用上面的函数属性(错误和格式)。查看更多https://pandas.pydata.org/pandas-docs/stable/ generated/pandas.to_datetime.html