我正在阅读两个不同的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
首先是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
此数据框使用以下代码进行转换:
dte = pd.to_datetime(dte, infer_datetime_format=True)
或
dte = pd.to_datetime(dte[x], format='%m/%d/%Y')
第二个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
此csv无法使用以下任何一种转换:
dtd = pd.to_datetime(dtd, infer_datetime_format=True)
或
dtd = pd.to_datetime(dtd, format='%Y-%m-%d')
它返回上面的值错误。但有趣的是,使用parse_dates和infer_datetime_format作为read_csv方法的参数可以正常工作。这里发生了什么?
答案 0 :(得分:9)
您可以stack
/ pd.to_datetime
/ unstack
pd.to_datetime(dte.stack()).unstack()
<强> 解释 强>
pd.to_datetime
适用于字符串,列表或pd.Series
。 dte
是pd.DataFrame
,这也是您遇到问题的原因。 dte.stack()
生成一个pd.Series
,其中所有行都堆叠在一起。但是,在这种堆叠形式中,因为它是pd.Series
,我可以使用矢量化pd.to_datetime
来处理它。后续unstack
只是将原始stack
翻转为dte
的原始形式
答案 1 :(得分:5)
对我而言,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
答案 2 :(得分:0)
它对我有用:
dtd.apply(lambda x: pd.to_datetime(x,errors = 'coerce', format = '%Y-%m-%d'))
这样,您可以使用上面的函数属性(错误和格式)。查看更多https://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.html
答案 3 :(得分:0)
只需添加-errors ='coerce'即可避免可能出现的任何错误/ NULL值
dtd = dtd.apply(pd.to_datetime(errors='coerce'))