【问题标题】:Add missing dates in the column in a PySpark data frame在 PySpark 数据框中的列中添加缺失日期
【发布时间】:2023-01-22 23:41:35
【问题描述】:

我需要将其他缺失的条目插入到 PySpark 数据框中,其中日期是一个季度的最后一天。

ID Date count
1 2018-03-31 1
1 2018-06-30 8
1 2018-12-31 1
1 2019-06-30 2

我需要输出如下所示:

ID Date count
1 2018-03-31 1
1 2018-06-30 8
1 2018-09-30 Null
1 2018-12-31 1
1 2019-06-30 Null
1 2019-06-30 2

有数百个这样的 ID,并且所有 ID 的季度日期数量都是固定的,即“2018-03-31”到“2019-06-30”。

【问题讨论】:

  • 为什么最后两个日期行相同?

标签: dataframe apache-spark date pyspark


【解决方案1】:

输入:

from pyspark.sql import functions as F
df = spark.createDataFrame(
    [(1, '2018-03-31', 1),
     (1, '2018-06-30', 8),
     (1, '2018-12-31', 1),
     (1, '2019-06-30', 2)],
    ['ID', 'Date', 'count'])

序列的最小日期的日期为第 31 号的情况

min_date = df.agg(F.min('Date')).head()[0]
max_date = df.agg(F.max('Date')).head()[0]

df = (df
    .select("ID").distinct()
    .withColumn("Date", F.expr(f"explode(sequence(to_date('{min_date}'), to_date('{max_date}'), interval 3 month))"))
    .join(df, ["ID", "Date"], "left")
)
df.show()
# +---+----------+-----+
# | ID|      Date|count|
# +---+----------+-----+
# |  1|2018-03-31|    1|
# |  1|2018-06-30|    8|
# |  1|2019-03-31| null|
# |  1|2018-12-31|    1|
# |  1|2018-09-30| null|
# |  1|2019-06-30|    2|
# +---+----------+-----+

选项同时适用于 30 和 31 作为序列中第一天的编号

如果您不知道最短日期是什么,此选项会更安全。一切都一样,就在加入日期向右移动 1 天之前。加入后,它们将返回到原始日期。

df = df.withColumn('Date', F.date_add('Date', 1))
min_date = df.agg(F.min('Date')).head()[0]
max_date = df.agg(F.max('Date')).head()[0]
df = (df
    .select("ID").distinct()
    .withColumn("Date", F.expr(f"explode(sequence(to_date('{min_date}'), to_date('{max_date}'), interval 3 month))"))
    .join(df, ["ID", "Date"], "left")
)
df = df.withColumn('Date', F.date_sub('Date', 1))

df.show()
# +---+----------+-----+
# | ID|      Date|count|
# +---+----------+-----+
# |  1|2018-03-31|    1|
# |  1|2018-06-30|    8|
# |  1|2019-03-31| null|
# |  1|2018-12-31|    1|
# |  1|2018-09-30| null|
# |  1|2019-06-30|    2|
# +---+----------+-----+

【讨论】:

  • 仅供参考 - 月末日期可以使用 last_day() 函数生成。
猜你喜欢
  • 2021-04-06
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多