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),那么代码就更清晰了。