如何修复镶木地板文件的python熊猫中的时间戳解释

Dom*_*den 5 python timestamp pandas parquet pyarrow

我有一些带有时间戳的 spark(scala) 数据帧/表,它们来自我们的 DHW,有时会使用一些高水印。

我想在 python 中使用 Pandas 处理这些数据,所以我将它们写为 spark 中的镶木地板文件,然后用 Pandas 再次读取。问题是 pandas/pyarrow 无法处理时间戳。这些转换为dateTime64[ns],女巫可以容纳的日期范围有限。所以一些时间戳(尤其是所有高水位标记)会得到错误的条目。

我如何强制熊猫将时间戳解释dateTime[mu]为例如。或者将高(和低)水印设置为 NAN 而不是仅使用错误的转换值?

这是一个最小的代码示例

火花:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._


val df_spark = Seq(
  (1, "1050-01-01 23:00:01"), 
  (2, "2014-11-30 12:40:32"), 
  (3, "2016-12-29 09:54:00"), 
  (4, "2500-01-01 00:00:00")).toDF("id", "date-string")
  .withColumn("valid_to", to_timestamp(col("date-string")))

df_spark.repartition(1).write.parquet("timestamptest")
df_spark.show
+---+-------------------+-------------------+
| id|        date-string|           valid_to|
+---+-------------------+-------------------+
|  1|1050-01-01 23:00:01|1050-01-01 23:00:01|
|  2|2014-11-30 12:40:32|2014-11-30 12:40:32|
|  3|2016-12-29 09:54:00|2016-12-29 09:54:00|
|  4|2500-01-01 00:00:00|2500-01-01 00:00:00|
+---+-------------------+-------------------+

Run Code Online (Sandbox Code Playgroud)

在 Python 中读取

import pandas as pd
df_pandas= pd.read_parquet("timestamptest")
df_pandas.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
 #   Column       Non-Null Count  Dtype         
---  ------       --------------  -----         
 0   id           4 non-null      int32         
 1   date-string  4 non-null      object        
 2   valid_to     4 non-null      datetime64[ns]
dtypes: datetime64[ns](1), int32(1), object(1)
memory usage: 208.0+ bytes


df_pandas

id  date-string valid_to
0   1   1050-01-01 23:00:01 2219-02-16 22:09:08.419103232
1   2   2014-11-30 12:40:32 2014-11-30 12:40:32.000000000
2   3   2016-12-29 09:54:00 2016-12-29 09:54:00.000000000
3   4   2500-01-01 00:00:00 1915-06-14 00:25:26.290448384

Run Code Online (Sandbox Code Playgroud)

你现在看到第一个和最后一个时间采样是错误的。如果我用火花再次阅读拼花,一切都很好。