【问题标题】:How to calculate date difference in pyspark?如何计算pyspark中的日期差异?
【发布时间】:2017-10-16 16:16:20
【问题描述】:

我有这样的数据:

df = sqlContext.createDataFrame([
    ('1986/10/15', 'z', 'null'), 
    ('1986/10/15', 'z', 'null'),
    ('1986/10/15', 'c', 'null'),
    ('1986/10/15', 'null', 'null'),
    ('1986/10/16', 'null', '4.0')],
    ('low', 'high', 'normal'))

我想计算low 列和2017-05-02 之间的日期差异,并用差异替换low 列。我已经在 stackoverflow 上尝试过相关的解决方案,但它们都不起作用。

【问题讨论】:

    标签: python apache-spark dataframe pyspark apache-spark-sql


    【解决方案1】:

    或者,如何使用 pySpark 查找两个后续用户操作之间经过的天数:

    import pyspark.sql.functions as funcs
    from pyspark.sql.window import Window
    
    window = Window.partitionBy('user_id').orderBy('action_date')
    
    df = df.withColumn("days_passed", funcs.datediff(df.action_date, 
                                      funcs.lag(df.action_date, 1).over(window)))
    
    
    
    +----------+-----------+-----------+
    |   user_id|action_date|days_passed| 
    +----------+-----------+-----------+
    |623       |2015-10-21|        null|
    |623       |2015-11-19|          29|
    |623       |2016-01-13|          59|
    |623       |2016-01-21|           8|
    |623       |2016-03-24|          63|
    +----------+----------+------------+
    

    【讨论】:

      【解决方案2】:

      您需要将low 列转换为上课日期,然后您可以将datediff()lit() 结合使用。使用 Spark 2.2

      from pyspark.sql.functions import datediff, to_date, lit
      
      df.withColumn("test", 
                    datediff(to_date(lit("2017-05-02")),
                             to_date("low","yyyy/MM/dd"))).show()
      +----------+----+------+-----+
      |       low|high|normal| test|
      +----------+----+------+-----+
      |1986/10/15|   z|  null|11157|
      |1986/10/15|   z|  null|11157|
      |1986/10/15|   c|  null|11157|
      |1986/10/15|null|  null|11157|
      |1986/10/16|null|   4.0|11156|
      +----------+----+------+-----+
      

      使用,我们需要先将low 列转换为timestamp 类:

      from pyspark.sql.functions import datediff, to_date, lit, unix_timestamp
      
      df.withColumn("test", 
                    datediff(to_date(lit("2017-05-02")),
                             to_date(unix_timestamp('low', "yyyy/MM/dd").cast("timestamp")))).show()
      

      【讨论】:

      • 我有一个错误“TypeError: to_date() 只需要 1 个参数(给定 2 个)”
      • 如果low列中有Nan值呢?
      • 那是因为你使用的是 Spark
      • 谢谢。以上只是一个测试数据。我的真实数据在low 列中有许多值无法转换为timestamp。 ` cast("timestamp") `时如何将这些值设置为 NaN?喜欢熊猫:pd.to_datetime(errors = 'coerce')
      • 那么它将默认为null,这不是你想要的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 2014-09-15
      • 2013-09-02
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多