pyspark从数据框列获取年,月,季度和季度月份数

时间:2020-07-27 09:35:11

标签: python dataframe date pyspark pyspark-dataframes

我输入了带有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获取所需输出中所述的新四列?

1 个答案:

答案 0 :(得分:2)

您可以使用date_format函数来创建大多数列。但是此功能使用java SimpleDate formatQuarter is not available。您必须使用月份号编写自己的代码。

这是您的操作方式:

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|
+----------+--------+---------+----+-------+-------------+