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

Posted

技术标签:

【中文标题】to_datetime 值错误:至少必须指定 [年、月、日] Pandas【英文标题】:to_datetime Value Error: at least that [year, month, day] must be specified Pandas 【发布时间】:2017-02-20 21:21:44 【问题描述】:

我正在读取两个不同的 CSV,每个 CSV 的列中都有日期值。在 read_csv 之后,我想使用 to_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 方法的参数可以正常工作。这里发生了什么?

【问题讨论】:

【参考方案1】:

你可以stack/pd.to_datetime/unstack

pd.to_datetime(dte.stack()).unstack()

解释pd.to_datetime 适用于字符串、列表或pd.Seriesdtepd.DataFrame,这就是您遇到问题的原因。 dte.stack() 产生一个 pd.Series ,其中所有行都堆叠在一起。然而,在这种堆叠形式中,因为它是一个pd.Series,我可以得到一个矢量化的pd.to_datetime 来处理它。随后的unstack 只是简单地将初始的stack 反转为dte 的原始形式

【讨论】:

这是如何工作的?我不明白操作的逻辑 啊,好的。非常感谢您的解释。 @piRSquared - 我想你可以添加你的评论来回答;)【参考方案2】:

对我来说工作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

【讨论】:

太棒了。很简单。谢谢! 很高兴能帮到你! 对不起,我是新来的,没有意识到我需要接受它。但是,我仍然很好奇错误的原因是什么。有什么想法吗? 我认为问题是 to_datetime 在旧版本的 pandas 中需要 Series,在较新版本中我收到错误 AttributeError: 'numpy.int64' object has no attribute 'lower',因为它需要最少 3 列与 yearmonth 和 @ 987654332@ - 请参阅to_datetime 中的第一个示例。 @Dorian821 还注意到 jezrael 的答案使用了apply,它采用dtd 的每一列并使用pd.to_datetime。这是有效的,因为每一列都是pd.Series,非常适合使用pd.to_datetime【参考方案3】:

它对我有用:

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

【讨论】:

【参考方案4】:

只想添加 -errors = 'coerce' 以避免您可能有任何错误/NULL 值

dtd = dtd.apply(pd.to_datetime(errors='coerce'))

【讨论】:

一般情况下,Errors = 'coerce' 应该是最后的选择,因为错误可能是由“NULL”值引起的

以上是关于to_datetime 值错误:至少必须指定 [年、月、日] Pandas的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 在 to_datetime 上调试

pd.datetime( )和pd.to_datetime( )

Gatsby - “值”必须至少包含 [icon, icons] 之一

时间转换py.datetime & pd.to_datetime

使用具有正确语法的 pandas to_datetime() 方法,无法识别的值类型:str?

指定的至少一个标签必须在 y_true 中,目标向量是数字