python - 将年和月组合为整数或对象,同时忽略 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
任何想法如何解决这个问题?
解决方案
.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
推荐阅读
- javascript - 根据可能为空的属性对数组进行排序
- azure - 如何使用 Azure Pipeline 构建语言版本“预览”的 .Net Core 5 项目?
- awk - 如何在特定列中添加双引号
- python - 如何在 PyCharm 中更改光标大小
- r - 替换 R 中测量单位的特定缩写
- sql - BETWEEN Two Dates 返回相同两个日期的行,而不是返回之间的行
- chart.js - Charts.js 烛台(财务图表)时间格式问题
- c++ - 制作用户定义的变量数组
- python - 带有自定义数据集的 TensorFlow lite 语音识别不起作用
- php - 如何在 Wordpress 中为评论字段使用动态占位符文本