【问题标题】:Pyspark toPandas() Out of bounds nanosecond timestamp errorPyspark toPandas() 超出纳秒时间戳错误
【发布时间】:2021-05-25 00:08:54
【问题描述】:

我正在尝试将 Spark DataFrame 转换为 Pandas。但是,它给出了以下错误:

OutOfBoundsDatetime: Out of bounds nanosecond timestamp:

有解决办法吗?

如果我删除所有时间戳列,它会起作用,但我想将整个表带入 Pandas。

在将 Spark DataFrame 引入 Pandas 时,我从未遇到过错误。

这是一个包含多个时间戳列的相当大的表。有些是YYYY-MM-DD,有些是YYYY-MM-DD 00:00:00 类型的列。

有几列包含不存在的年份变量,数量不详。

下面是一个例子。

data = {
    "ID": ["AB", "CD", "DE", "EF"],
    "year": [2016, 2017, 2018, 2018],
    "time_var_1": [
        "3924-01-04 00:00:00",
        "4004-12-12 12:38:00",
        "2018-10-02 01:32:23",
        "2018-04-05 00:00:00",
    ],
}

df = pd.DataFrame(data)

sdf = spark.createDataFrame(df)

sdf = sdf.withColumn("time_var_1", spark_fns.to_timestamp(spark_fns.col("time_var_1")))

我对 PySpark 不是很熟悉,所以我不确定将表从 Spark DataFrame 带到 Pandas 时是否有 errors='coerce' 等效项。

【问题讨论】:

    标签: pandas apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以使用 when 将无效的时间戳用 null 屏蔽:

    import pandas as pd
    import pyspark.sql.functions as F
    
    pdf = sdf.withColumn(
        'time_var_1',
        F.when(F.col('time_var_1') < F.lit(pd.Timestamp.max), F.col('time_var_1'))
    ).toPandas()
    
    print(pdf)
       ID  year          time_var_1
    0  AB  2016                 NaT
    1  CD  2017                 NaT
    2  DE  2018 2018-10-02 01:32:23
    3  EF  2018 2018-04-05 00:00:00
    

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多