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

时间:2020-10-09 08:55:19

标签: python pandas timestamp parquet pyarrow

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

我想在python中使用pandas处理此数据,因此我将它们作为来自spark的镶木地板文件写入,并再次使用pandas读取。 问题是熊猫/小鸟无法处理时间戳。它们被转换为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|
+---+-------------------+-------------------+

在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

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

0 个答案:

没有答案