在一列中有日期,如何創建包含ISO 周日期的列?
ISO 周日期由年、周數和作業日組成。
- 年份與使用
year函式獲得的年份不同。 - 周數是最簡單的部分 - 可以使用
weekofyear. - 作業日應該在星期一回傳 1,星期天回傳 7,而 Spark
dayofweek不能這樣做。
示例資料框:
from pyspark.sql import SparkSession, functions as F
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame([
('1977-12-31',),
('1978-01-01',),
('1978-01-02',),
('1978-12-31',),
('1979-01-01',),
('1979-12-30',),
('1979-12-31',),
('1980-01-01',)],
['my_date']
).select(F.col('my_date').cast('date'))
df.show()
# ----------
#| my_date|
# ----------
#|1977-12-31|
#|1978-01-01|
#|1978-01-02|
#|1978-12-31|
#|1979-01-01|
#|1979-12-30|
#|1979-12-31|
#|1980-01-01|
# ----------
想要的結果:
---------- -------------
| my_date|iso_week_date|
---------- -------------
|1977-12-31| 1977-W52-6|
|1978-01-01| 1977-W52-7|
|1978-01-02| 1978-W01-1|
|1978-12-31| 1978-W52-7|
|1979-01-01| 1979-W01-1|
|1979-12-30| 1979-W52-7|
|1979-12-31| 1980-W01-1|
|1980-01-01| 1980-W01-2|
---------- -------------
uj5u.com熱心網友回復:
您的解決方案已經很好,也許您可??以通過簡化計算來縮短它:
iso_weekday=(dayofweek(my_date) 5)%7 1iso_year=year(date_add(my_date, 4 - iso_weekday))
這給了你:
import pyspark.sql.functions as F
df.withColumn(
'iso_week_date',
F.concat_ws(
"-",
F.year(F.expr("date_add(my_date, 4 - (dayofweek(my_date) 5) % 7 1)")),
F.lpad(F.weekofyear('my_date'), 3, "W0"),
(F.dayofweek('my_date') 5) % 7 1
)
).show()
# ---------- -------------
#| my_date|iso_week_date|
# ---------- -------------
#|1977-12-31| 1977-W52-6|
#|1978-01-01| 1977-W52-7|
#|1978-01-02| 1978-W01-1|
#|1978-12-31| 1978-W52-7|
#|1979-01-01| 1979-W01-1|
#|1979-12-30| 1979-W52-7|
#|1979-12-31| 1980-W01-1|
#|1980-01-01| 1980-W01-2|
# ---------- -------------
uj5u.com熱心網友回復:
首先,可以為year和weekday列創建規則。然后,使用concat_ws和連接它們lpad。
week_from_prev_year = (F.month('my_date') == 1) & (F.weekofyear('my_date') > 9)
week_from_next_year = (F.month('my_date') == 12) & (F.weekofyear('my_date') == 1)
iso_year = F.when(week_from_prev_year, F.year('my_date') - 1) \
.when(week_from_next_year, F.year('my_date') 1) \
.otherwise(F.year('my_date'))
iso_weekday = F.when(F.dayofweek('my_date') != 1, F.dayofweek('my_date')-1).otherwise(7)
iso_week_date = F.concat_ws('-', iso_year, F.lpad(F.weekofyear('my_date'), 3, 'W0'), iso_weekday)
df2 = df.withColumn('iso_week_date', iso_week_date)
df2.show()
# ---------- -------------
#| my_date|iso_week_date|
# ---------- -------------
#|1977-12-31| 1977-W52-6|
#|1978-01-01| 1977-W52-7|
#|1978-01-02| 1978-W01-1|
#|1978-12-31| 1978-W52-7|
#|1979-01-01| 1979-W01-1|
#|1979-12-30| 1979-W52-7|
#|1979-12-31| 1980-W01-1|
#|1980-01-01| 1980-W01-2|
# ---------- -------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/396943.html
標籤:阿帕奇火花 日期 火花 apache-spark-sql 火花3
下一篇:提取部分列名以進行重命名
