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

Python to_datetime值错误:至少必须指定[年、月、日],python,pandas,csv,datetime,Python,Pandas,Csv,Datetime,我正在阅读两个不同的CSV,每个CSV的列中都有日期值。在读取完csv后,我想用to_datetime方法将数据转换为datetime。每个CSV中的日期格式略有不同,尽管在to_datetime format参数中注意到并指定了这些差异,但其中一个可以很好地转换,而另一个返回以下值错误 ValueError: to assemble mappings requires at least that [year, month, day] be sp ecified: [day,month,year

我正在阅读两个不同的CSV,每个CSV的列中都有日期值。在读取完csv后,我想用to_datetime方法将数据转换为datetime。每个CSV中的日期格式略有不同,尽管在to_datetime format参数中注意到并指定了这些差异,但其中一个可以很好地转换,而另一个返回以下值错误

ValueError: to assemble mappings requires at least that [year, month, day] be sp
ecified: [day,month,year] is missing
第一个dte.head()

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

dte = pd.to_datetime(dte, infer_datetime_format=True)

第二个dtd.head()

此csv不会使用以下任何一种方式进行转换:

dtd = pd.to_datetime(dtd, infer_datetime_format=True)

它返回上面的值错误。然而,有趣的是,使用parse_dates和推断_datetime_格式作为read_csv方法的参数可以很好地工作。这是怎么回事

对于me works功能:


您可以
stack
/
pd.to\u datetime
/
unstack

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

解释
pd.to\u datetime
适用于字符串、列表或
pd.Series
dte
是一个
pd.DataFrame
,这就是您遇到问题的原因
dte.stack()
生成一个a
pd.Series
,其中所有行堆叠在一起。但是,在这种堆叠形式中,因为它是一个
pd.Series
,所以我可以得到一个向量化的
pd.to\u datetime
来处理它。随后的
unstack
简单地反转初始
堆栈
,以获得
dte的原始形式

它对我有效:

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

通过这种方式,您可以使用上述函数属性(错误和格式)。查看更多信息,只想添加-errors='concurve'以避免可能出现的任何错误/空值

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

令人惊叹的。很简单。谢谢很高兴能帮助你!对不起,我是新来的,没有意识到我需要接受它。然而,我仍然好奇错误的原因是什么。有什么想法吗?我想问题是
到_datetime
需要
系列
在旧版本的熊猫中,在新版本中我得到错误
属性错误:“numpy.int64”对象没有属性“lower”
,因为它需要最少3列
年份
-参见中的第一个示例。@Dorian821还注意到,jezrael的回答使用了
apply
,它取
dtd的每一列
,并使用
pd.to_datetime
。这是因为每列都是一个
pd.Series
,非常适合使用
pd.to\u datetime
。这是如何工作的?我不明白操作的逻辑啊,好的。非常感谢您的解释。@piRSquared-我想您可以在回答中添加您的评论;)
dtd = pd.to_datetime(dtd, format='%Y-%m-%d')
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
pd.to_datetime(dte.stack()).unstack()
dtd.apply(lambda x: pd.to_datetime(x,errors = 'coerce', format = '%Y-%m-%d'))
dtd = dtd.apply(pd.to_datetime(errors='coerce'))