解析具有远期日期的CSV到Parquet

问题描述

我正在尝试将CS​​V读入Pandas,然后将其写入Parquet。挑战在于CSV的date列的值为3000-12-31,显然Pandas无法将该值存储为实际日期。因此,PyArrow无法读取日期值。

要复制的示例文件代码

test.csv

t
3000-12-31
import pandas as pd
import pyarrow as pa
df = pd.read_csv("test.csv",parse_dates=["t"])
schema = pa.schema([pa.field("t",pa.date64())])
table = pa.Table.from_pandas(df,schema=schema)

这给出了(有些无益的错误

TypeError:必须为整数(got类型为str)

什么是正确的方法

解决方法

Pandas datetime列(使用datetime64[ns]数据类型)确实不能存储此类日期。

一个可能的解决方法是将字符串转换为对象dtype列中的datetime.datetime个对象。然后pyarrow应该能够接受它们来创建日期列。 例如,可以使用dateutil完成此转换:

>>> import dateutil
>>> df['t'] = df['t'].apply(dateutil.parser.parse)
>>> df
                     t
0  3000-12-31 00:00:00

>>> table = pa.Table.from_pandas(df,schema=schema)
>>> table
pyarrow.Table
t: date64[ms]

或者如果您使用固定格式,则使用datetime.date.strptime可能更可靠:

>>> import datetime
>>> df['t'] = df['t'].apply(lambda s: datetime.datetime.strptime(s,"%Y-%m-%d"))
>>> table = pa.Table.from_pandas(df,schema=schema)
>>> table
pyarrow.Table
t: date64[ms]