Python to_datetime值错误:至少必须指定[年、月、日]
我正在阅读两个不同的CSV,每个CSV的列中都有日期值。在读取完csv后,我想用to_datetime方法将数据转换为datetime。每个CSV中的日期格式略有不同,尽管在to_datetime format参数中注意到并指定了这些差异,但其中一个可以很好地转换,而另一个返回以下值错误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
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()
生成一个apd.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'))