如何解决解析具有远期日期的CSV到Parquet
我正在尝试将CSV读入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]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。