【问题标题】:PyArrow issue with timestamp data时间戳数据的 PyArrow 问题
【发布时间】:2022-10-05 02:10:15
【问题描述】:

我正在尝试使用 pyarrow 将数据从 csv 加载到镶木地板文件中。我正在使用转换选项将数据类型设置为正确的类型,然后使用 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 strptime apache-arrow


    【解决方案1】:

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

    作为一种解决方法,您可以首先将时间戳读取为字符串,然后通过切掉小数部分来处理它们,并将其作为 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 处理小数秒呢?
    • 用建议更新了答案。
    【解决方案2】:

    所以我发现对于时间戳数据,您应该尝试使用默认解析器格式(ISO8601)的数据。例如,如果您使用 pyarrow 时间戳数据类型将 csv 数据转换为镶木地板。只需以这种格式保存 csv 数据:

    无时区

    YYYY-MM-DDTHH:MI:SS.FF6
    

    有时区

    YYYY-MM-DDTHH:MI:SS.FF6TZH:TZM
    

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 2020-12-28
      • 2018-04-16
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多