如何用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
相关产品推荐
相关产品推荐

