将具有远期日期的 CSV 解析为 Parquet

Parse CSV with far future dates to Parquet

我正在尝试将 CSV 读入 Pandas,然后将其写入 Parquet。挑战在于 CSV 有一个值为 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: an integer is required (got type str)

正确的做法是什么?

Pandas 日期时间列(使用 datetime64[ns] 数据类型)确实无法存储此类日期。

一种可能的解决方法是将字符串转换为对象数据类型列中的 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]