PyArrow 的时间戳数据问题

标签 pyarrow strptime apache-arrow

我正在尝试使用 pyarrow 将数据从 csv 加载到 parquet 文件中。我使用转换选项将数据类型设置为正确的类型,然后使用 timestamp_parsers 选项来指示如何解释时间戳数据:请参阅下面的“csv”:

time,data
01-11-19 10:11:56.132,xxx

请参阅下面我的代码示例。

import pyarrow as pa
from pyarrow import csv
from pyarrow import parquet


convert_dict = {
    'time': pa.timestamp('us', None),
    'data': pa.string()
}

convert_options = csv.ConvertOptions(
    column_types=convert_dict
    , strings_can_be_null=True
    , quoted_strings_can_be_null=True
    , timestamp_parsers=['%d-%m-%y %H:%M:%S.%f']
)

table = csv.read_csv('test.csv', convert_options=convert_options)
print(table)
parquet.write_table(table, 'test.parquet')

基本上,pyarrow 不喜欢某些 strptime 值。具体来说,在这种情况下,它不喜欢代表秒小数的“%f”( https://www.geeksforgeeks.org/python-datetime-strptime-function/ )。任何帮助让 pyarrow 完成我需要的事情将不胜感激。

需要明确的是,如果我将数据编辑为没有小数秒,然后从 timestamp_parsers 选项中删除“%f”,我就可以运行代码。但是我需要保持数据的完整性,所以这不是一个选择。对我来说,这似乎是 pyarrow 中的错误,或者我是个白痴,错过了一些明显的东西。打开这两个选项只是想知道它是什么。

最佳答案

pyarrow 不支持

%f ,而且很可能不会,因为它是 Python 特定标志。请参阅此处的讨论:https://issues.apache.org/jira/browse/ARROW-15883。 PR 当然总是受欢迎的!

作为一种解决方法,您可以首先将时间戳读取为字符串,然后通过切掉小数部分来处理它们,并将其作为 pa.duration 添加到已处理的时间戳中:

import pyarrow as pa
import pyarrow.compute as pc
ts = pa.array(["1970-01-01T00:00:59.123456789", "2000-02-29T23:23:23.999999999"], pa.string())
ts2 = pc.strptime(pc.utf8_slice_codeunits(ts, 0, 19), format="%Y-%m-%dT%H:%M:%S", unit="ns")
d = pc.utf8_slice_codeunits(ts, 20, 99).cast(pa.int64()).cast(pa.duration("ns"))
pc.add(ts2, d)

关于PyArrow 的时间戳数据问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73780443/

相关文章:

python - 自 apache arrow 1.0.1 发布以来用于长期存储的 Feather 格式

python - Azure 数据湖的 Pyarrow 切片下推

pyarrow - 使用数据构建表。避免创建数据框

python - 如何在python中将特定整数转换为日期时间

python - 比较日期的 strptime 替代方法?

rlang::hash 无法区分箭头查询

r - 如何在 Apache Arrow 中使用泛型?

rust - 使用Arrow/Datafusion/Polars(如python panda的groupby)按列值分区?

python - 如何将 pyarrow timestamp dtype 转换为 time64 类型?

python - time.strptime 得到 TypeError : function takes at most 8 arguments (9 given)