【问题标题】:PySpark Keep only Year and Month in DatePySpark 仅保留年份和月份
【发布时间】:2021-01-15 20:01:32
【问题描述】:

我有一个数据框,其中有一列 date_key 带有 Datetype。问题是我想创建另一个只有yyyy-mmpart 的date_key 的列,但仍然保留它的日期类型。我试过(to_date(df[date_key],'YYYY-MM') 不起作用。还尝试了date_format(df[date_key] , 'YYYY-MM'),但结果是字符串而不是日期类型。有人可以帮忙吗?非常感谢。我需要得到的结果是2020-09的格式,后面没有日期或时间戳。

【问题讨论】:

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


    【解决方案1】:

    您可以使用date_trunc 来降低时间戳的精度:

    df = spark.createDataFrame([['2020-09-30'], ['2020-11-11']], ['date'])\
          .select(to_date(col('date'), 'yyyy-MM-dd').alias('date_key'))
    df.show()
    
    +----------+
    |  date_key|
    +----------+
    |2020-09-30|
    |2020-11-11|
    +----------+
    

    然后截断:

    df.select(f.date_trunc('mm', col('date_key'))).show()
    
    +------------------------+
    |date_trunc(mm, date_key)|
    +------------------------+
    |     2020-09-01 00:00:00|
    |     2020-11-01 00:00:00|
    +------------------------+
    

    date_trunc 将保持指定格式的精度,mm 在这种情况下表示月份。

    【讨论】:

    • 谢谢,但我需要得到的结果是 2020-09 没有 01 日期部分,这与精度无关
    • @user3735871 您混淆了实际时间戳和打印时的样子。 "2020-09" 可以是2020-09-01 00:00:002020-09-012020-09-01 00:00:00.000 的字符串表示形式,它们都是日期或时间戳值。没有打印2020-09 的默认格式。但是我上面的代码输出的值是2020-09,但是作为日期/时间类型,这就是你要找的。​​span>
    • 当然你可以使用date_format(df['date_key'],'yyyy-MM'),就像你自己说的那样。但这会产生一个字符串,而不是时间戳。
    猜你喜欢
    • 2013-02-05
    • 2015-08-17
    • 2014-08-07
    • 1970-01-01
    • 2018-06-28
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多