从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日为周日,即上一财年的最后一周