如何将浮点数转换为 Parquet TIMESTAMP 逻辑类型?

How to convert a float to a Parquet TIMESTAMP Logical Type?

假设我有一个 pyarrow table,其列 Timestamp 包含 float64。 这些浮点数实际上是用 s 表示的时间戳。 例如:

import pyarrow as pa
my_table = pa.table({'timestamp': pa.array([1600419000.477,1600419001.027])})

我从 documentation 那里了解到 Parquet 逻辑类型。 请问,如何将这些浮点值转换为逻辑类型 TIMESTAMP? 我没有看到有关执行此操作的方法的文档。

感谢您的帮助。 祝你有美好的一天, 最佳,

我认为您无法将箭头内的浮点数转换为时间戳。

A​​rrow 假定时间戳是给定精度(ms、us、ns)的 64 位整数。在您的情况下,您必须将秒浮点数乘以您想要的精度(毫秒为 1000),然后转换为 int64 并转换为时间戳。

这是一个使用 pandas 的例子:

(
    pa.array([1600419000.477,1600419001.027])
    .to_pandas()
    .mul(1000)
    .astype('long')
    .pipe(pa.Array.from_pandas)
    .cast(pa.timestamp('ms'))
)

这给你:

<pyarrow.lib.TimestampArray object at 0x7fb5025b6a08>
[
  2020-09-18 08:50:00.477,
  2020-09-18 08:50:01.027
]

你需要在pyarrow中将floats转换为实际的时间戳类型,然后它会自动写入paruet逻辑时间戳类型。

使用 pyarrow.compute 模块,这种转换也可以在 pyarrow 中完成(在 pandas 中进行转换不太符合人体工程学,但避免转换到 pandas 并返回):

>>> import pyarrow.compute as pc
>>> arr = pa.array([1600419000.477,1600419001.027])
>>> pc.multiply(arr, pa.scalar(1000.)).cast("int64").cast(pa.timestamp('ms'))
<pyarrow.lib.TimestampArray object at 0x7fe5ec3df588>
[
  2020-09-18 08:50:00.477,
  2020-09-18 08:50:01.027
]