python - 在 pyspark 数据框中将周末日期转移到上一个工作日
问题描述
我有 pyspark 数据框,其中有数据列,也有周末日期。我只想将这些日期更改为上一个或下一个工作日。
from pyspark.sql.session import SparkSession
spark = SparkSession.builder.getOrCreate()
columns = ['Date', 'id', 'dogs', 'cats']
vals = [('04-05-2018',1, 2, 0), ('05-05-2018',2, 0, 1), ('06-05-2018',2, 0, 1)]
df = spark.createDataFrame(vals, columns)
df.show()
数据框看起来像:
+----------+---+----+----+
| Date| id|dogs|cats|
+----------+---+----+----+
|04-05-2018| 1| 2| 0|
|05-05-2018| 2| 0| 1|
|06-05-2018| 2| 0| 1|
+----------+---+----+----+
现在,我可以在单独的列中识别工作日
df = df.withColumn('Date', unix_timestamp(df['Date'].cast("string"), 'dd-MM-yyyy').cast("double").cast('timestamp').cast('date'))
df = df.select('Date', date_format('Date', 'u').alias('dow_number'), 'id', 'dogs', 'cats')
temp = df
temp.show()
+----------+----------+---+----+----+
| Date|dow_number| id|dogs|cats|
+----------+----------+---+----+----+
|2018-05-04| 5| 1| 2| 0|
|2018-05-05| 6| 2| 0| 1|
|2018-05-06| 7| 2| 0| 1|
+----------+----------+---+----+----+
现在我只想将数据转移到最后一个工作日或下一个工作日(如果是周末),这意味着我希望我的数据框是这样的:
+----------+----------+---+----+----+
| Date|dow_number| id|dogs|cats|
+----------+----------+---+----+----+
|2018-05-04| 5| 1| 2| 0|
|2018-05-04| 5| 2| 0| 1|
|2018-05-04| 5| 2| 0| 1|
+----------+----------+---+----+----+
提前致谢。
解决方案
使用生成的 dow_number,您可以使用 date_sub() 应用条件来检查和减去日期,
df = df.withColumn('Date1',F.when(df['dow_number'] == 6,F.date_sub(df.Date,1)).when(df['dow_number'] == 7,F.date_sub(df.Date,2)).otherwise(df.Date))
+----------+----------+---+----+----+----------+
| Date|dow_number| id|dogs|cats| Date1|
+----------+----------+---+----+----+----------+
|2018-05-04| 5| 1| 2| 0|2018-05-04|
|2018-05-05| 6| 2| 0| 1|2018-05-04|
|2018-05-06| 7| 2| 0| 1|2018-05-04|
+----------+----------+---+----+----+----------+
我相信,您也不需要更改 dow_number。如果需要,您可以在新日期使用 date_format 并获取它(或)应用上述其他条件。希望这可以帮助!
推荐阅读
- c# - 从列表创建树视图
WPF - c# - unity player 位置加载错误
- javascript - 通过点击“mailto”链接跳转到页面顶部
- plsql - PL/SQL 中的异常处理和回滚
- javascript - 如何让 Vue 在表单字段中使用与 value 属性不同的值?
- python - 如何增加 pandas.DataFrame.plot 的图像大小
- c# - 为 AddIn 使用特定的程序集
- c# - ASP.NET Attribute Routes 和 default 路由可以一起工作吗?
- python - Blender 和 LabVIEW 之间 ZeroMQ 通信期间的延迟测量
- tsql - T-SQL - 连接多个表会导致重复行