【问题标题】:Extracting the year from Date in Pyspark dataframe从 Pyspark 数据框中的日期中提取年份
【发布时间】:2019-08-25 10:22:19
【问题描述】:

我有一个 Pyspark 数据框,其中包含一个日期列“报告日期”(类型:字符串)。从日期中提取年份后,我想获取另一列的计数。

如果我使用字符串日期列,我可以得到计数。

crimeFile_date.groupBy("Reported Date").sum("Offence Count").show()

我得到了这个输出

+-------------+------------------+
|Reported Date|sum(Offence Count)|
+-------------+------------------+
|   13/08/2010|               342|
|    6/10/2011|               334|
|   27/11/2011|               269|
|   12/01/2012|               303|
|   22/02/2012|               286|
|   31/07/2012|               276|
|   25/04/2013|               222|
+-------------+------------------+

为了从“报告日期”中提取年份,我已将其转换为日期格式 (using this approach) 并将列命名为“日期”。 但是,当我尝试使用相同的代码按新列分组并进行计数时,我收到一条错误消息。

crimeFile_date.groupBy(year("Date").alias("year")).sum("Offence Count").show()
TypeError: strptime() argument 1 must be str, not None

这是数据架构:

root
 |-- Offence Count: integer (nullable = true)
 |-- Reported Date: string (nullable = true)
 |-- Date: date (nullable = true)

有没有办法解决这个错误?或使用另一种方法提取年份? 谢谢

【问题讨论】:

    标签: python pyspark rdd


    【解决方案1】:

    如果我理解正确,那么您想从字符串日期列中提取年份。当然,一种方法是使用正则表达式,但有时如果正则表达式不能处理所有场景,它可能会使您的逻辑中断。

    这里是日期数据类型方法。

    进口

    import pyspark.sql.functions as f
    

    创建你的数据框

    l1 = [('13/08/2010',342),('6/10/2011',334),('27/11/2011',269),('12/01/2012',303),('22/02/2012',286),('31/07/2012',276),('25/04/2013',222)]
    dfl1 =  spark.createDataFrame(l1).toDF("dates","sum")
    
    dfl1.show()
    +----------+---+
    |     dates|sum|
    +----------+---+
    |13/08/2010|342|
    | 6/10/2011|334|
    |27/11/2011|269|
    |12/01/2012|303|
    |22/02/2012|286|
    |31/07/2012|276|
    |25/04/2013|222|
    +----------+---+
    
    

    现在,您可以使用函数包的 to_timestamp 或 to_date api

    dfl2 = dfl1.withColumn('years',f.year(f.to_timestamp('dates', 'dd/MM/yyyy')))
    
    dfl2.show()
    +----------+---+-----+
    |     dates|sum|years|
    +----------+---+-----+
    |13/08/2010|342| 2010|
    | 6/10/2011|334| 2011|
    |27/11/2011|269| 2011|
    |12/01/2012|303| 2012|
    |22/02/2012|286| 2012|
    |31/07/2012|276| 2012|
    |25/04/2013|222| 2013|
    +----------+---+-----+
    

    现在,按年份分组。

    dfl2.groupBy('years').sum('sum').show()
    +-----+--------+                                                                
    |years|sum(sum)|
    +-----+--------+
    | 2013|     222|
    | 2012|     865|
    | 2010|     342|
    | 2011|     603|
    +-----+--------+
    

    显示为多个步骤以供理解,但您可以将提取年份和分组方式组合在一个步骤中。

    如果您需要其他帮助,我们很乐意扩展。

    【讨论】:

    • 感谢您的回答 SMaZ。我将它应用于我的 DataFrame,它返回的结果与您的相似。现在的问题是输出显示重复年份?我没有得到每年的总和。这是这段代码的主要目标。
    • 您想保留原来的日期栏吗?还是只求当年的总和?
    • 太好了,很高兴能帮上忙。刚刚编辑了答案。编码快乐..!
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2016-08-02
    • 2021-05-24
    • 2013-03-05
    相关资源
    最近更新 更多