我在列下面有一个数据框:
df
id dt
1 2016/2017 Q2
2 2017/2018 Q1
3 2018/2019 Q2
输出:
df
id date
1 2016-07-01
2 2017-04-01
3 2018-07-01
我需要在pyspark中将它们转换为日期。通常,我使用以下代码通过指定格式将日期转换为日期,但是找不到四分之一的格式,请您指教。
代码:F.from_unixtime(F.unix_timestamp(date_str, fmt)).cast("date")
答案 0 :(得分:2)
我认为没有直接函数/格式可以返回季度日期。
在这种情况下,我们需要使用when
语句(或)udf
。
示例:
df=spark.createDataFrame([("1","2016/2017 Q2"),("2","2017/2018 Q1"),("3","2018/2019 Q3"),("4","2019/2020 Q4")],["id","dt"])
#4 quarters in an year
df.withColumn("date",
when(lower(reverse(split(col("dt")," "))[0]) == "q1",concat_ws("-",substring(col("dt"),0,4),lit("01-01")).cast("date")).\
when(lower(reverse(split(col("dt")," "))[0]) == "q2",concat_ws("-",substring(col("dt"),0,4),lit("04-01")).cast("date")).\
when(lower(reverse(split(col("dt")," "))[0]) == "q3",concat_ws("-",substring(col("dt"),0,4),lit("07-01")).cast("date")).\
when(lower(reverse(split(col("dt")," "))[0]) == "q4",concat_ws("-",substring(col("dt"),0,4),lit("10-01")).cast("date")).\
otherwise(lit("Quarter not found"))).show()
#+---+------------+----------+
#| id| dt| date|
#+---+------------+----------+
#| 1|2016/2017 Q2|2016-04-01|
#| 2|2017/2018 Q1|2017-01-01|
#| 3|2018/2019 Q3|2018-07-01|
#| 4|2019/2020 Q4|2019-10-01|
#+---+------------+----------+