Смена дат выходного дня на последний день недели в фрейме pyspark - PullRequest
0 голосов
/ 04 мая 2018

У меня есть фрейм данных 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()

DataFrame выглядит так:

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

Заранее спасибо.

1 Ответ

0 голосов
/ 04 мая 2018

Используя сгенерированный 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 на новую дату и получить (или) применить другое условие, как указано выше. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...