Как заменить функцию Timedelta Pandas чистой функцией PySpark? - PullRequest
1 голос
/ 13 октября 2019

Я разрабатываю небольшой скрипт в PySpark, который генерирует последовательность дат (за 36 месяцев до сегодняшней даты) и (при применении усечения в качестве первого дня месяца). В общем, я справился с этой задачей, однако

Но с помощью пакета Pandas Timedelta для расчета дельты времени.

Есть ли способ заменить эту Timedelta из Pandas на чистую функцию PySpark?

import pandas as pd
from datetime import date, timedelta, datetime
from pyspark.sql.functions import col, date_trunc

today = datetime.today()
data = [((date(today.year, today.month, 1) - pd.Timedelta(36,'M')),date(today.year, today.month, 1))] # I want to replace this Pandas function
df = spark.createDataFrame(data, ["minDate", "maxDate"])

+----------+----------+
|   minDate|   maxDate|
+----------+----------+
|2016-10-01|2019-10-01|
+----------+----------+

import pyspark.sql.functions as f

df = df.withColumn("monthsDiff", f.months_between("maxDate", "minDate"))\
    .withColumn("repeat", f.expr("split(repeat(',', monthsDiff), ',')"))\
    .select("*", f.posexplode("repeat").alias("date", "val"))\ #
    .withColumn("date", f.expr("add_months(minDate, date)"))\
    .select('date')\
    .show(n=50)

+----------+
|      date|
+----------+
|2016-10-01|
|2016-11-01|
|2016-12-01|
|2017-01-01|
|2017-02-01|
|2017-03-01|
 etc...
+----------+

1 Ответ

4 голосов
/ 13 октября 2019

Вы можете использовать встроенную функцию Pyspark trunc.

pyspark.sql.functions.trunc (date, format) Возвращает дату, усеченную до единицы, указанной в формате.

Parameters:
format – ‘year’, ‘YYYY’, ‘yy’ or ‘month’, ‘mon’, ‘mm’

Представьте, что у меня есть приведенный ниже фрейм данных.

list = [(1,),]
df=spark.createDataFrame(list, ['id'])

import pyspark.sql.functions as f

df=df.withColumn("start_date" ,f.add_months(f.trunc(f.current_date(),"month") ,-36))
df=df.withColumn("max_date" ,f.trunc(f.current_date(),"month"))

>>> df.show()
+---+----------+----------+
| id|start_date|  max_date|
+---+----------+----------+
|  1|2016-10-01|2019-10-01|
+---+----------+----------+

Вот ссылка с дополнительными функциями даты.

Функции даты Pyspark

...