将具有远期日期的 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]
我正在尝试将 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]