从PySpark中的日期列计算一年中的星期

时间:2019-11-19 11:26:24

标签: pyspark pyspark-sql pyspark-dataframes

我的数据框看起来像-

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中做这件事?

2 个答案:

答案 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|
+---+----------+------------------+