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

从PySpark中的日期列计算一年中的星期,pyspark,pyspark-sql,pyspark-dataframes,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 .. 我希望我的数据框看起来像- i

我的数据框看起来像-

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           ..
我希望我的数据框看起来像-

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周。但我希望我的开始日期应该是四月(从财政年度日历)。如何在pyspark中执行此操作?

有两种方法。要么编写一个
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|
+---+----------+------------------+

你有两种方法。要么编写一个
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|
+---+----------+------------------+

以满足明年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|
+---+----------+------------------+

以满足明年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|
+---+----------+------------------+

你必须自己编写一个函数。与日期相对应的输出应该是什么:
2019-01-01
?你必须自己编写一个函数。与日期相对应的输出应该是什么:
2019-01-01
2018-04-01
应该是
第一周不是?这周从周一开始,周日结束。对于2018年,4月1日是星期日是指上一财年的最后一周
2018-04-01
应该是
1周
不是吗?本周从周一开始,周日结束。2018年4月1日为周日,即上一财年的最后一周