You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyArrow将CSV字符串时间转为Parquet的TIMESTAMPMILLI类型

解决CSV转Parquet时Timestamp列类型转换问题

你的核心问题在于timestamp_parsers参数格式错误,且未明确指定列类型规则,导致PyArrow未自动将字符串列解析为时间戳类型。以下是两种可行的正确实现方案:

方案一:读取CSV时直接指定类型与解析规则

通过ConvertOptions同时定义列类型和时间戳解析格式,一步完成转换:

import pyarrow.csv as pv
import pyarrow.parquet as pq
import pyarrow as pa

# 配置CSV转换选项
convert_options = pv.ConvertOptions(
    # 明确指定列类型:"Timestamp (UTC)"对应Parquet的TIMESTAMPMILLI(即PyArrow的timestamp[ms])
    column_types={
        "Timestamp (UTC)": pa.timestamp("ms"),
        "Temperature": pa.float64()
    },
    # 时间戳解析格式(注意是列表,而非集合/字典)
    timestamp_parsers=["%m/%d/%Y %I:%M:%S %p"]
)

# 读取CSV并自动转换类型
table = pv.read_csv("your_input.csv", convert_options=convert_options)

# (可选)重命名列名以贴合需求
table = table.rename_columns(["time", "temperature"])

# 写入Parquet文件
pq.write_table(table, f"./{device_id}.parquet")

方案二:读取后手动转换字符串列为时间戳列

如果读取时未指定类型,可通过PyArrow的计算函数手动转换:

import pyarrow.csv as pv
import pyarrow.parquet as pq
import pyarrow as pa

# 先读取CSV(此时Timestamp列是字符串类型)
table = pv.read_csv("your_input.csv")

# 将字符串列转换为毫秒精度时间戳(对应TIMESTAMPMILLI)
timestamp_col = pa.compute.strptime(
    table["Timestamp (UTC)"],
    format="%m/%d/%Y %I:%M:%S %p",
    unit="ms"
)

# 构建新表替换原列
new_table = pa.table(
    [timestamp_col, table["Temperature"]],
    names=["time", "temperature"]
)

# 写入Parquet文件
pq.write_table(new_table, f"./{device_id}.parquet")

关键注意事项

  • timestamp_parsers参数接受列表而非集合/字典,你之前用的{"%-m/%-d/%Y %-I:%M:%S %p"}是集合类型,格式错误。
  • 要生成Parquet的TIMESTAMPMILLI类型,PyArrow中需使用pa.timestamp("ms")(毫秒精度时间戳)。
  • 时间格式字符串中的%-m这类带减号的GNU扩展格式,PyArrow解析器不兼容,直接用%m(带前导零的月份)、%d(带前导零的日期)即可,示例数据7/6/2021会被正确解析。

内容的提问来源于stack exchange,提问作者Nick Ponomar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:45:33