python - pyspark 从数据框列中获取年、月、季度和季度月数
问题描述
我输入了带有 partner_id 和 month_id 的两列(采用 STRING - YYMM 格式)
partner_id|month_id|
1001 | 2001 |
1002 | 2002 |
1003 | 2003 |
1001 | 2004 |
1002 | 2005 |
1003 | 2006 |
1001 | 2007 |
1002 | 2008 |
1003 | 2009 |
1003 | 2010 |
1003 | 2011 |
1003 | 2012 |
所需输出:
partner_id|month_id|month_num|year|qtr_num|qtr_month_num|
1001 | 2001 |01 |2020|1 |1 |
1002 | 2002 |02 |2020|1 |2 |
1003 | 2003 |03 |2020|1 |3 |
1001 | 2004 |04 |2020|2 |1 |
1002 | 2005 |05 |2020|2 |2 |
1003 | 2006 |06 |2020|2 |3 |
1001 | 2007 |07 |2020|3 |1 |
1002 | 2008 |08 |2020|3 |2 |
1003 | 2009 |09 |2020|3 |3 |
1003 | 2010 |10 |2020|4 |1 |
1003 | 2011 |11 |2020|4 |2 |
1003 | 2012 |12 |2020|4 |3 |
我想从 month_id 列创建这些新列。我使用了 data_format() 函数,但没有得到正确的结果,因为它 month_id 列是字符串类型,特别是它是 YYMM 格式。我们如何根据month_id获得所需输出中规定的新四列???
解决方案
您可以使用该date_format
功能来创建大部分列。但是这个函数使用java SimpleDate 格式。季度不可用。您必须使用月份数编写自己的代码。
这是您的操作方法:
df.withColumn("date_col", F.to_timestamp("month_id", "yyMM")).select(
"partner_id",
"month_id",
F.date_format("date_col", "MM").alias("month_num"),
F.date_format("date_col", "YYYY").alias("year"),
((F.date_format("date_col", "MM") + 2) / 3).cast("int").alias("qtr_num"),
(((F.date_format("date_col", "MM") - 1) % 3) + 1)
.cast("int")
.alias("qtr_month_num"),
).show()
+----------+--------+---------+----+-------+-------------+
|partner_id|month_id|month_num|year|qtr_num|qtr_month_num|
+----------+--------+---------+----+-------+-------------+
| 1001| 2001| 01|2020| 1| 1|
| 1002| 2002| 02|2020| 1| 2|
| 1003| 2003| 03|2020| 1| 3|
| 1001| 2004| 04|2020| 2| 1|
| 1002| 2005| 05|2020| 2| 2|
| 1003| 2006| 06|2020| 2| 3|
| 1001| 2007| 07|2020| 3| 1|
| 1002| 2008| 08|2020| 3| 2|
| 1003| 2009| 09|2020| 3| 3|
| 1003| 2010| 10|2020| 4| 1|
| 1003| 2011| 11|2020| 4| 2|
| 1003| 2012| 12|2020| 4| 3|
+----------+--------+---------+----+-------+-------------+
推荐阅读
- java - JavaMailSenderImpl 上的消息异常
- oauth-2.0 - Spring Boot 作为资源服务器(JWK 验证)和 Angular/Cordova 作为前端 - 用于社交登录(Facebook 和 Google)的 OAuth2 支持
- javascript - 单击其中一个面时,如何平滑过渡 3d 立方体动画?
- javascript - JavaScript 中 for-body 的运行时语义
- java - 如何避免类标签被带有招摇的方法标签覆盖?
- d3.js - 使用 dc.js 的具有二维和双 x 轴的箱形图
- javascript - 使用 forEach 将 setState 与 Filelist 反应
- javascript - 失去焦点时自动折叠侧边栏菜单列表
- php - 使用 PHP DateTime 设置年份
- verilog - SystemVerilog 使用接口数组