计算日期类型列的最大值和最小值之间的天数差

Compute the difference in days between the max and the min of a date type column

我在 PySpark 中加载的 table 有一列“日期”,其中包含以下类型的数据:

Date Open High Low Close Volume Adj Close
1/3/2012 59.97 61.06 59.87 60.33 12668800 52.61923
1/4/2012 60.21 60.35 59.47 59.71 9593300 52.07848
1/5/2012 59.35 59.62 58.37 59.42 12768200 51.82554
1/6/2012 59.42 59.45 58.87 59 8069400 51.45922

如何计算列的最大值和最小值之间的天数差异(因此在上面的示例中,我需要 2012 年 1 月 6 日和 2012 年 1 月 3 日之间的天数差异

假设您的数据框 df 只有日期格式的列 Date,您可以执行以下操作:

from pyspark.sql import functions as F

(df.withColumn('Max_Date', F.max(F.col('Date')))
   .withColumn('Min_Date', F.min(F.col('Date')))
   .withColumn('Diff_days', F.datediff(F.col('Max_Date'), F.col('Min_Date')))
   .drop('Date').dropDuplicates())

在此 link 中,您可以找到有关 pyspark sql 函数的更多示例: https://sparkbyexamples.com/spark/spark-sql-functions/

测试数据:

from pyspark.sql import functions as F

df = spark.createDataFrame([('2012-01-03',),('2013-02-03',),('2011-11-29',)], ['Date']).select(F.col('Date').cast('date'))
df.show()
# +----------+
# |      Date|
# +----------+
# |2012-01-03|
# |2013-02-03|
# |2011-11-29|
# +----------+

这将创建一个包含天数差异的新数据框:

df_diff = df.groupBy().agg(F.datediff(F.max('Date'), F.min('Date')).alias('diff'))

df_diff.show()
# +----+
# |diff|
# +----+
# | 432|
# +----+

# If you need the difference in a variable:
v = df_diff.head().diff
print(v)
# 432

这将为您现有的 df 添加一个新列:

df = df.withColumn('diff', F.expr('datediff(max(Date) over(), min(Date) over())'))

df.show()
# +----------+----+
# |      Date|diff|
# +----------+----+
# |2012-01-03| 432|
# |2013-02-03| 432|
# |2011-11-29| 432|
# +----------+----+