Python 3.x 在pd中创建日期时处理ValueError
我正在读取一个带有Python 3.x 在pd中创建日期时处理ValueError,python-3.x,pandas,datetime,valueerror,Python 3.x,Pandas,Datetime,Valueerror,我正在读取一个带有p,day,month的csv文件,并将其放入df中。目标是从天、月、当前年创建一个日期,我在2月29日遇到了这个错误: ValueError: cannot assemble the datetimes: day is out of range for month 我想当这个错误发生时,把前一天替换掉。我们怎么能做到呢?下面是我的pd的几行,最后的datex是我想要的 p day month year datex 0 p1 29 02
p,day,month
的csv文件,并将其放入df
中。目标是从天、月、当前年创建一个日期,我在2月29日遇到了这个错误:
ValueError: cannot assemble the datetimes: day is out of range for month
我想当这个错误发生时,把前一天替换掉。我们怎么能做到呢?下面是我的pd的几行,最后的datex
是我想要的
p day month year datex
0 p1 29 02 2021 28Feb-2021
1 p2 18 07 2021 18Jul-2021
2 p3 12 09 2021 12Sep-2021
现在,我的日期代码只在下面,所以我有一个不存在日期的nan
df['datex'] = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce')
您可以尝试以下方法:
df['datex'] = pd.to_datetime(df[['year', 'month', 'day']], errors='coerce')
事实上,你得到了NA:
p day year month datex
0 p1 29 2021 2 NaT
1 p2 18 2021 7 2021-07-18
2 p3 12 2021 9 2021-09-12
然后,您可以为这些NA创建一个特定案例:
df.loc[df.datex.isnull(), 'previous_day'] = df.day -1
p day year month datex previous_day
0 p1 29 2021 2 NaT 28.0
1 p2 18 2021 7 2021-07-18 NaN
2 p3 12 2021 9 2021-09-12 NaN
df.loc[df.datex.isnull(), 'datex'] = pd.to_datetime(df[['previous_day', 'year', 'month']].rename(columns={'previous_day': 'day'}))
p day year month datex previous_day
0 p1 29 2021 2 2021-02-28 28.0
1 p2 18 2021 7 2021-07-18 NaN
2 p3 12 2021 9 2021-09-12 NaN
如果要在day列中保留day=29,则必须创建一个新的day列。尝试使用闰年,例如2020年,我不能,因为在这之后,我想计算这个
datex
和另一个2021年的日期之间的天数差。好吧,你可以使用条件,比如,如果月=2&&day==29,那么使用day=28为什么不先做一个简单的清理呢?e、 g.df['day']=np。其中((df['day']==29)和(df['month']==2),df['day']-1,df['day'])
-不需要额外的列,也不需要对NaT
进行特殊处理。在预期的输出中,day列对于此行仍然必须包含29。但事实上,如果可以在流程结束后为此行安排新的一天(28),那么代码就更清晰了。