Date 从带破折号的字符串中分析列到日期

Date 从带破折号的字符串中分析列到日期,date,datetime,pandas,casting,date-format,Date,Datetime,Pandas,Casting,Date Format,正在尝试将列df['day']解析为日期时间类型。值当前以字符串形式写入,例如:2016-9-1。这对应于年-月-日 我将遵循此页面的格式: 我最初尝试使用 pd.to_datetime(df['day'], format="%Y-%m-%d") 但是我犯了错误 ValueError: time data 'day' does match format specified 我认为问题在于,日期和月份不是零,填充了,所以将其更改为: pd.to_datetime(df['day'], for

正在尝试将列
df['day']
解析为日期时间类型。值当前以字符串形式写入,例如:
2016-9-1
。这对应于年-月-日

我将遵循此页面的格式:

我最初尝试使用

pd.to_datetime(df['day'], format="%Y-%m-%d")
但是我犯了错误

ValueError: time data 'day' does match format specified
我认为问题在于,日期和月份不是零,填充了,所以将其更改为:

pd.to_datetime(df['day'], format="%Y-%-m-%-d")
我使用的是
%-m
%-d
,因为两者都对应于非零填充(十进制)数字

获取不同的错误:

ValueError: '-' is a bad directive in format '%Y-%-m-%-d'

我是否应该遵循中的格式约定,我是否遗漏了什么?

您需要删除参数
格式中的
-

df = pd.DataFrame({'day':['2016-9-1']})
print (df)
        day
0  2016-9-1

print (pd.to_datetime(df['day'], format="%Y-%m-%d"))
0   2016-09-01
Name: day, dtype: datetime64[ns]
编辑:

因此,它看起来像一些坏数据,因此您可以使用:

df = pd.DataFrame({'day':['2016-9-1', '2016-12-0']})
print (df)
         day
0   2016-9-1
1  2016-12-0

#check problematic values
print (df[pd.to_datetime(df['day'], format="%Y-%m-%d", errors='coerce').isnull()])
         day
1  2016-12-0

#convert problematic values to NaT
print (pd.to_datetime(df['day'], format="%Y-%m-%d", errors='coerce'))
0   2016-09-01
1          NaT
Name: day, dtype: datetime64[ns]

奇怪的是,当我单独运行你的代码时,我得到了和你一样的输出。然而,当我在整个数据帧上运行时,我得到
ValueError:time数据“day”与指定的格式不匹配。你的评估很准确,数据很糟糕。我不敢相信我浪费了多少时间没有检查这个。