我正在嘗試創建從最小日期到最大日期的所有月份的日期陣列!
例子:
min_date = "2021-05-31"
max_date = "2021-11-30"
.withColumn('array_date', F.expr('sequence(to_date(min_date), to_date(max_date), interval 1 month)')
但它給了我以下輸出:
['2021-05-31', '2021-06-30', '2021-07-31', '2021-08-31', '2021-09-30', '2021-10-31']
為什么沒有出現上限11/30/2021?在檔案中,它說包括極端情況。
我想要的輸出是:
['2021-05-31', '2021-06-30', '2021-07-31', '2021-08-31', '2021-09-30', '2021-10-31', '2021-11-30']
謝謝!
uj5u.com熱心網友回復:
我認為這與時區有關。我可以在我的時區重現相同的行為,Europe/Paris但是在設定時區時UTC會給出預期的結果:
from pyspark.sql import functions as F
spark.conf.set("spark.sql.session.timeZone", "UTC")
df = spark.createDataFrame([("2021-05-31", "2021-11-30")], ["min_date", "max_date"])
df.withColumn(
"array_date",
F.expr("sequence(to_date(min_date), to_date(max_date), interval 1 month)")
).show(truncate=False)
# ---------- ---------- ------------------------------------------------------------------------------------
#|min_date |max_date |array_date |
# ---------- ---------- ------------------------------------------------------------------------------------
#|2021-05-31|2021-11-30|[2021-05-31, 2021-06-30, 2021-07-31, 2021-08-31, 2021-09-30, 2021-10-31, 2021-11-30]|
# ---------- ---------- ------------------------------------------------------------------------------------
或者,您可以使用TimestampTypefor 序列的開始和結束引數,而不是DateType:
df.withColumn(
"array_date",
F.expr("sequence(to_timestamp(min_date), to_timestamp(max_date), interval 1 month)").cast("array<date>")
).show(truncate=False)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419849.html
標籤:
