gpt4 book ai didi

apache-spark - 在pyspark数据帧中的两个日期之间生成每月时间戳

转载 作者:行者123 更新时间:2023-12-03 15:36:18 25 4
gpt4 key购买 nike

我有一些带有 "date" 的 DataFrame列,我正在尝试生成一个新的 DataFrame,其中包含来自 "date" 的最小和最大日期之间的所有月度时间戳。柱子。

解决方案之一如下:

month_step = 31*60*60*24

min_date, max_date = df.select(min_("date").cast("long"), max_("date").cast("long")).first()

df_ts = spark.range(
(min_date / month_step) * month_step,
((max_date / month_step) + 1) * month_step,
month_step
).select(col("id").cast("timestamp").alias("yearmonth"))

df_formatted_ts = df_ts.withColumn(
"yearmonth",
f.concat(f.year("yearmonth"), f.lit('-'), format_string("%02d", f.month("yearmonth")))
).select('yearmonth')

df_formatted_ts.orderBy(asc('yearmonth')).show(150, False)

问题是我把它当成了 month_step 31 天并不完全正确,因为有些月份有 30 天甚至 28 天。有可能以某种方式使它更精确吗?

就像一个便条 : 后来我只需要 年份 值,所以我将忽略日期和时间。但无论如何,因为我在相当大的日期范围(2001 年和 2018 年之间)之间生成时间戳,时间戳会发生变化。

这就是为什么有时会跳过几个月的原因。例如,此快照缺少 2010-02:

|2010-01  |
|2010-03 |
|2010-04 |
|2010-05 |
|2010-06 |
|2010-07 |

我查了一下,从 2001 年到 2018 年只跳过了 3 个月。

最佳答案

假设您有以下 DataFrame:

data = [("2000-01-01","2002-12-01")]
df = spark.createDataFrame(data, ["minDate", "maxDate"])
df.show()
#+----------+----------+
#| minDate| maxDate|
#+----------+----------+
#|2000-01-01|2002-12-01|
#+----------+----------+

您可以添加一列 date之间的所有月份 minDatemaxDate , 遵循与 my answer 相同的方法至 this question .

只需更换 pyspark.sql.functions.datediffpyspark.sql.functions.months_between ,并使用 add_months而不是 date_add :

import pyspark.sql.functions as f

df.withColumn("monthsDiff", f.months_between("maxDate", "minDate"))\
.withColumn("repeat", f.expr("split(repeat(',', monthsDiff), ',')"))\
.select("*", f.posexplode("repeat").alias("date", "val"))\
.withColumn("date", f.expr("add_months(minDate, date)"))\
.select('date')\
.show(n=50)
#+----------+
#| date|
#+----------+
#|2000-01-01|
#|2000-02-01|
#|2000-03-01|
#|2000-04-01|
# ...skipping some rows...
#|2002-10-01|
#|2002-11-01|
#|2002-12-01|
#+----------+

关于apache-spark - 在pyspark数据帧中的两个日期之间生成每月时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52412643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com