时间戳数据出现PyArrow问题



我正试图使用pyarrow将csv中的数据加载到镶木地板文件中。我使用convert选项将数据类型设置为它们的正确类型,然后使用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做我需要的事情,我们将不胜感激。

为了清楚起见,如果我编辑数据使其没有小数秒,然后删除"%",我就可以运行代码f";来自timestamp_parsers选项。然而,我需要保持数据的完整性,所以这不是一个选项。对我来说,这似乎是pyarrow中的一个bug,或者我是个白痴,错过了一些显而易见的东西。打开两个选项只是想知道是哪一个。

pyarrow中不支持

%f,而且很可能不会支持,因为它是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)

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

无时区

YYYY-MM-DDTHH:MI:SS.FF6

带时区

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

最新更新