Pyspark 在从另一列中找到最大日期后生成一个数据框列,其中包含直到去年为止的所有月末日期的描述
Pyspark generate a dataframe column having description of all the month end dates till last year after finding the max date from another column
我有一个 date
列(整数类型)。我必须找到 date
的最大值,并生成一个描述列,其中包含截至上一年的日期的详细信息。
例如,该列的最大日期是 20181210,那么应该有一个包含 text
的列用于 current quarter
、previous quarter
、current year
个月,并且 previous year
个月。
date
text
20180731
prev quarter
20180831
prev quarter
20180930
prev quarter
20181130
recent year
20181031
recent year
20180930
recent year
20180831
recent year
20180731
recent year
20180630
recent year
20180531
recent year
20180430
recent year
20180331
recent year
20180228
recent year
20180131
recent year
20171231
prev year
20171130
prev year
20171031
prev year
20170930
prev year
..
..
..
..
我尝试从 date
列中提取 year
、month
和 day
,然后放置 if 条件。
还有其他更简单的方法吗?
您可以在 df 中获取最大日期并与原始数据框进行交叉连接,然后使用一些 when 表达式来设置描述列:
from pyspark.sql import functions as F
# convert date into date type
df = df.withColumn("date", F.to_date(F.col("date").cast("string"), "yyyyMMdd"))
max_date_df = df.agg(F.max("date").alias("max_date"))
result = df.crossJoin(max_date_df) \
.withColumn(
"text",
F.when(
F.year("date") < F.year("max_date"),
F.lit("prev year")
).when(
(F.year("date") == F.year("max_date")) & (F.quarter("date") == F.quarter("max_date") - 1),
F.lit("prev quarter")
).when(
(F.year("date") == F.year("max_date")) & (F.quarter("date") == F.quarter("max_date")),
F.lit("current quarter")
).otherwise(F.lit("recent year"))
).select("date", "text")
result.show()
#+----------+---------------+
#| date| text|
#+----------+---------------+
#|2017-09-30| prev year|
#|2017-10-31| prev year|
#|2017-11-30| prev year|
#|2018-01-31| recent year|
#|2018-02-28| recent year|
#|2018-03-31| recent year|
#|2018-04-30| recent year|
#|2018-05-31| recent year|
#|2018-06-30| recent year|
#|2018-07-31| prev quarter|
#|2018-07-31| prev quarter|
#|2018-08-31| prev quarter|
#|2018-08-31| prev quarter|
#|2018-09-30| prev quarter|
#|2018-09-30| prev quarter|
#|2018-09-30| prev quarter|
#|2018-10-31|current quarter|
#|2018-10-31|current quarter|
#|2018-11-30|current quarter|
#|2018-11-30|current quarter|
#+----------+---------------+
我有一个 date
列(整数类型)。我必须找到 date
的最大值,并生成一个描述列,其中包含截至上一年的日期的详细信息。
例如,该列的最大日期是 20181210,那么应该有一个包含 text
的列用于 current quarter
、previous quarter
、current year
个月,并且 previous year
个月。
date | text |
---|---|
20180731 | prev quarter |
20180831 | prev quarter |
20180930 | prev quarter |
20181130 | recent year |
20181031 | recent year |
20180930 | recent year |
20180831 | recent year |
20180731 | recent year |
20180630 | recent year |
20180531 | recent year |
20180430 | recent year |
20180331 | recent year |
20180228 | recent year |
20180131 | recent year |
20171231 | prev year |
20171130 | prev year |
20171031 | prev year |
20170930 | prev year |
.. | .. |
.. | .. |
我尝试从 date
列中提取 year
、month
和 day
,然后放置 if 条件。
还有其他更简单的方法吗?
您可以在 df 中获取最大日期并与原始数据框进行交叉连接,然后使用一些 when 表达式来设置描述列:
from pyspark.sql import functions as F
# convert date into date type
df = df.withColumn("date", F.to_date(F.col("date").cast("string"), "yyyyMMdd"))
max_date_df = df.agg(F.max("date").alias("max_date"))
result = df.crossJoin(max_date_df) \
.withColumn(
"text",
F.when(
F.year("date") < F.year("max_date"),
F.lit("prev year")
).when(
(F.year("date") == F.year("max_date")) & (F.quarter("date") == F.quarter("max_date") - 1),
F.lit("prev quarter")
).when(
(F.year("date") == F.year("max_date")) & (F.quarter("date") == F.quarter("max_date")),
F.lit("current quarter")
).otherwise(F.lit("recent year"))
).select("date", "text")
result.show()
#+----------+---------------+
#| date| text|
#+----------+---------------+
#|2017-09-30| prev year|
#|2017-10-31| prev year|
#|2017-11-30| prev year|
#|2018-01-31| recent year|
#|2018-02-28| recent year|
#|2018-03-31| recent year|
#|2018-04-30| recent year|
#|2018-05-31| recent year|
#|2018-06-30| recent year|
#|2018-07-31| prev quarter|
#|2018-07-31| prev quarter|
#|2018-08-31| prev quarter|
#|2018-08-31| prev quarter|
#|2018-09-30| prev quarter|
#|2018-09-30| prev quarter|
#|2018-09-30| prev quarter|
#|2018-10-31|current quarter|
#|2018-10-31|current quarter|
#|2018-11-30|current quarter|
#|2018-11-30|current quarter|
#+----------+---------------+