首页 > 解决方案 > 将年和月组合为整数或对象,同时忽略 nan

问题描述

我有一个数据框,正在使用熊猫。数据框有很多列,其中一些是日期时间格式:

id       calv1       calv2
1   2006-08-29  2007-08-29
2          NaT         NaT
3   2006-08-29         NaT
4   2006-08-29  2007-08-29
5   2006-08-29  2013-08-29
6   2006-08-29         NaT

我正在尝试创建一个新列,在其中使用日期时间列中的年份和月份,并将它们组合成整数或字符串。而且我想忽略 Nat/nan 值,因此这些值要么是 none/nan 值,要么只是零。

id       calv1       calv2     YM1     YM2
1   2006-08-29  2007-08-29  200608  200708
2          NaT         NaT       0       0
3   2006-08-29         NaT  200608       0
4   2006-08-29  2007-08-29  200608  200708  
5   2006-08-29  2013-08-29  200608  201308  
6   2006-08-29         NaT  200608       0  

这是我尝试过的:

df['YM1'] = ((pd.DatetimeIndex(df['calv1']).year).astype(str) +
   (pd.DatetimeIndex(df['calv1']).month).astype(str))

和:

df['YM1'] = (((df['calv1']).dt.year).astype(str) +
   ((df['calv1']).dt.month).astype(str))

但是输出列中的值如下所示:

2014.011.0

或者

2014.09.0

当然,NaT 值是

 nannan

任何想法如何解决这个问题?

标签: pythonpandas

解决方案


.dt.strftime您可以使用和将日期格式化为年月%Y%m,然后您可以将其转换为int. 对于列calv1,例如:

df.calv1.dt.strftime('%Y%m').fillna(0).astype(int)

0    200608
1         0
2    200608
3    200608
4    200608
5    200608
Name: calv1, dtype: int32

将其分配回数据框:

df[['YM1', 'YM2']] = df[['calv1', 'calv2']].apply(
    lambda s: s.dt.strftime('%Y%m').fillna(0).astype(int)
)

df
   id      calv1      calv2     YM1     YM2
0   1 2006-08-29 2007-08-29  200608  200708
1   2        NaT        NaT       0       0
2   3 2006-08-29        NaT  200608       0
3   4 2006-08-29 2007-08-29  200608  200708
4   5 2006-08-29 2013-08-29  200608  201308
5   6 2006-08-29        NaT  200608       0

推荐阅读