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

PyArrow中如何不转Pandas从Timestamp提取年月日用作Parquet分区

PyArrow原生实现时间字段提取、无Pandas转换的落地方案

你之前的代码无法运行,核心原因是混淆了Arrow Table和Pandas DataFrame的API体系——PyArrow从3.0版本开始就内置了全套C++实现的向量化时间处理能力,完全可以在不转换为Pandas DataFrame的前提下完成年、月、日字段提取,且计算全程基于Arrow列式内存结构执行,零跨框架内存拷贝开销,完全适配大文件场景的性能要求。

核心实现步骤

1. 读取CSV阶段提前指定字段类型

在构建Dataset时直接定义time列为Timestamp类型,避免依赖PyArrow的隐式类型推断,从源头减少额外计算开销:

import pyarrow.dataset as ds
import pyarrow.compute as pc
import pyarrow.parquet as pq

# 自定义读取Schema,将time字段显式定义为秒级精度的Timestamp类型
csv_schema = ds.schema([
    # 其余业务字段按实际读取结构补充
    ("time", ds.timestamp(unit="s", tz=None))
])
dataset = ds.dataset(csv_path, format="csv", schema=csv_schema)
arrow_table = dataset.to_table()

2. 向量化提取年、月、日字段

直接调用pyarrow.compute模块内置的时间维度提取函数,对Arrow Array进行批量计算,完全替代Pandas风格的map/apply逐行操作,可用函数包括:

  • 提取年份:pc.year()
  • 提取月份:pc.month()
  • 提取日期:pc.day()
# 基于time列批量计算新字段
year_arr = pc.year(arrow_table["time"])
month_arr = pc.month(arrow_table["time"])
day_arr = pc.day(arrow_table["time"])

# 将新字段追加到原Arrow Table,无逐行遍历开销
final_table = arrow_table \
    .append_column("year", year_arr) \
    .append_column("month", month_arr) \
    .append_column("day", day_arr)

3. 以时间字段为分区键写入Parquet

调用PyArrow原生的Parquet写入接口,直接将year/month/day指定为分区列,无需手动拼接分区路径:

pq.write_to_dataset(
    table=final_table,
    root_path=parquet_output_path,
    partition_cols=["year", "month", "day"],
    compression="snappy"
)

特殊场景处理

如果读取CSV时time列被识别为字符串类型,无需转Pandas,可直接通过计算函数完成字符串转Timestamp:

# 字符串格式的time列直接转Timestamp类型
time_timestamp_arr = pc.strptime(
    arrow_table["time"],
    format="%Y-%m-%d %H:%M:%S",
    unit="s"
)
# 后续年/月/日提取、表拼接、Parquet写入的逻辑与上述流程完全一致

全流程无任何Pandas侧的类型转换操作,所有计算均为C++层实现的向量化批量操作,处理大文件时性能比转Pandas处理的模式高1个数量级以上,且不会产生额外的内存拷贝开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 08:27:02