我的数据框看起来像-
id date
1 2018-08-12
2 2019-01-23
3 2019-04-03
我希望数据框看起来像-
id date week
1 2018-08-12 ..
2 2019-01-23 ..
3 2019-04-03 ..
我到目前为止已完成-
df = df.withColumn('week', F.weekofyear('date'))
但是将其视为1月1日是第1周。但是我希望我的开始日期应该是4月(来自财政年度日历)。如何在pyspark中做这件事?
答案 0 :(得分:2)
您有两种方法可以做到这一点。您要么编写udf
(并失去spark
并行化的所有好处),要么添加要抵消的值,例如:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame([
(1, "2018-08-12"),
(2, "2018-04-01"),
(3, "2019-04-03"),
], ["id", "date"])
df = df.withColumn('date', f.to_date(f.col('date')))
df.withColumn('week_of_year_april',
f.weekofyear(f.col('date')) - f.weekofyear(f.to_date(f.lit('2018-04-01')))).show()
+---+----------+------------------+
| id| date|week_of_year_april|
+---+----------+------------------+
| 1|2018-08-12| 19|
| 2|2018-04-01| 0|
| 3|2019-04-03| 1|
+---+----------+------------------+
答案 1 :(得分:1)
为了满足明年4月之前的所有日期。我们需要减去代码中一年的总周数。
df = spark.createDataFrame([
(1, "2018-08-12"),
(2, "2018-04-01"),
(3, "2019-03-03"),
], ["id", "date"])
df = df.withColumn('date', func.to_date(func.col('date')))
df.withColumn('week_of_year_april',\
func.when(((func.weekofyear(func.col('date')) - func.weekofyear(func.to_date(func.lit('2018-04-01'))))>func.lit(0)),\
(func.weekofyear(func.col('date')) - func.weekofyear(func.to_date(func.lit('2018-04-01')))))\
.otherwise((func.weekofyear(func.col('date')) - func.weekofyear(func.to_date(func.lit('2018-04-01')))) + func.lit(52)))\
.show()
+---+----------+------------------+
| id| date|week_of_year_april|
+---+----------+------------------+
| 1|2018-08-12| 19|
| 2|2018-04-01| 52|
| 3|2019-03-03| 48|
+---+----------+------------------+