Skip to main content
 首页 » 编程设计

python之Pandas:如何删除包含无效月/日列组合的行,例如 2 月 30 日

2025年05月04日13me-sa

我的源数据使用 31 列作为日期值,每个月一行。我已将 31 天的列合并为一天列,现在我想将年、月和日列合并到日期时间(?)列中,以便我可以按年/月/日对行进行排序。

融化后,我的数据框如下所示:

       year  month day   prcp 
0      1893      1  01    0.0 
1      1893      2  01    0.0 
2      1893      3  01    0.0 
3      1893      4  01    NaN 
4      1893      5  01    NaN 
5      1893      6  01    NaN 
6      1893      7  01    NaN 
7      1893      8  01    0.0 
8      1893      9  01   10.0 
9      1893     10  01    0.0 
10     1893     11  01    0.0 
11     1893     12  01    NaN 
12     1894      1  01    NaN 
13     1894      2  01    0.0 
14     1894      3  01    NaN 
... 

接下来,我尝试创建一个可以排序的“时间”列,使用年、月和日列作为日期时间构造函数的参数。我试过使用这种方法来做到这一点:

def make_datetime(y, m, d): 
    return(datetime(year=y, month=m, day=d)) 
 
df['time'] = np.vectorize(make_datetime)(df['year'].astype(int), df['month'].astype(int), df['day'].astype(int)) 

以上不会让我到达那里,因为在月份/日期列在一起没有意义的情况下它会失败,例如非闰年的 2 月 29 日,4 月 31 日等。我认为我接下来要做的是以某种方式将 datetime() 调用包装在 try/catch 中,当它由于不兼容的月/日组合而发出声音时,我应该将行放在 catch block 中。如果不对所有行进行 for 循环,我将如何去做呢?或者有更好的方法来解决这个问题吗?

请您参考如下方法:

您可以直接将 df 传递给 to_datetime

pd.to_datetime(df,errors='coerce') 
Out[905]:  
#          NaT 
#          NaT 
#   1892-02-29 
#          NaT 
#          NaT 
#          NaT 
#   1896-02-29 
#          NaT 
#          NaT 
dtype: datetime64[ns] 
df['New']=pd.to_datetime(df,errors='coerce') 
df.dropna() 
Out[907]:  
   year  month  day        New 
#  1892      2   29 1892-02-29 
#  1896      2   29 1896-02-29