【问题标题】:Pyspark: 202001 and 202053 (yyyyww) to_date gives nullPyspark:202001 和 202053(yyyyww)to_date 给出 null
【发布时间】:2021-04-20 17:10:22
【问题描述】:

我有一个带有 yearweek 列的数据框,我想将其转换为日期。我写的代码似乎每周都可以工作,除了'202001'和'202053'周,例如:

df = spark.createDataFrame([
(1, "202001"), 
(2, "202002"), 
(3, "202003"), 
(4, "202052"), 
(5, "202053")
], ['id', 'week_year'])

df.withColumn("date", F.to_date(F.col("week_year"), "yyyyw")).show()

这几周我不知道是什么错误,也不知道如何解决。如何将 202001 和 202053 周转换为有效日期?

【问题讨论】:

    标签: date apache-spark pyspark apache-spark-sql week-number


    【解决方案1】:

    在 Spark 中处理 ISO 周确实是一个令人头疼的问题 - 事实上,此功能在 Spark 3 中已被弃用(删除?)。我认为在 UDF 中使用 Python 日期时间实用程序是一种更灵活的方法。

    import datetime
    import pyspark.sql.functions as F
    
    @F.udf('date')
    def week_year_to_date(week_year):
        # the '1' is for specifying the first day of the week
        return datetime.datetime.strptime(week_year + '1', '%G%V%u')
    
    df = spark.createDataFrame([
    (1, "202001"), 
    (2, "202002"), 
    (3, "202003"), 
    (4, "202052"), 
    (5, "202053")
    ], ['id', 'week_year'])
    
    df.withColumn("date", week_year_to_date('week_year')).show()
    +---+---------+----------+
    | id|week_year|      date|
    +---+---------+----------+
    |  1|   202001|2019-12-30|
    |  2|   202002|2020-01-06|
    |  3|   202003|2020-01-13|
    |  4|   202052|2020-12-21|
    |  5|   202053|2020-12-28|
    +---+---------+----------+
    

    【讨论】:

    • 谢谢,这对我有帮助!由于这是首选方式,我会将您的标记为答案。不幸的是,我们在集群上运行 Python 版本 3.5.2,所以我不得不恢复到一个更丑陋的解决方案。我会在另一个答案中添加我的。
    【解决方案2】:

    根据 mck 的回答,这是我最终用于 Python 3.5.2 版的解决方案:

    import datetime
    from dateutil.relativedelta import relativedelta
    import pyspark.sql.functions as F
    
    @F.udf('date')
    def week_year_to_date(week_year):
        # the '1' is for specifying the first day of the week
        return datetime.datetime.strptime(week_year + '1', '%Y%W%w') - relativedelta(weeks = 1)
    
    df = spark.createDataFrame([
    (9, "201952"), 
    (1, "202001"), 
    (2, "202002"), 
    (3, "202003"), 
    (4, "202052"), 
    (5, "202053")
    ], ['id', 'week_year'])
    
    df.withColumn("date", week_year_to_date('week_year')).show()
    

    如果不使用 3.6 中添加的“%G%V%u”,我必须从日期中减去一周才能得到正确的日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2016-01-29
      相关资源
      最近更新 更多