【问题标题】:How to filter a Parquet file by datetime column while reading with Dask?使用 Dask 阅读时如何按日期时间列过滤 Parquet 文件?
【发布时间】:2021-07-30 10:28:35
【问题描述】:

我想在使用 Dask 读取 Parquet 文件时对其进行过滤,但我无法正确处理并不断收到相同的错误。

TypeError: '>=' not supported between instances of 'Timestamp' and 'str'

我目前的做法是:

ddf = dd.read_parquet(path="s3://[BUCKET_NAME]/[FOLDER/PREFIX]/*",
                      columns=['COL1', 'COL2', 'DATE_COL'],
                      filters=[[('DATE_COL', '>=', '2020-05-01'), ('DATE_COL', '<', '2020-06-01')]],
                      engine="pyarrow-dataset")

'DATE_COL' 具有 dtype datetime64[ns] 和一些 NaT 值。其他列的 dtype 为 object

有人知道怎么做吗?也许我需要提供 dtype 参数,如果是这种情况,我如何告诉 read_parquet() 方法“DATE_COL”是日期时间列?

更新

如果我尝试以下操作:

ddf = dd.read_parquet(path="s3://[BUCKET_NAME]/[FOLDER/PREFIX]/*",
                      columns=['COL1', 'COL2', 'DATE_COL'],
                      filters=[[('DATE_COL', '>=', pd.Timestamp('2020-05-01')), ('DATE_COL', '<', pd.Timestamp('2020-06-01'))]],
                      engine="pyarrow-dataset")

我收到此错误:

TypeError: Cannot compare tz-naive and tz-aware timestamps

【问题讨论】:

    标签: dataframe filter dask parquet pyarrow


    【解决方案1】:

    TypeError:无法比较 tz-naive 和 tz-aware 时间戳

    这表明您应该为您的时间戳指定一个时区,例如pd.Timestamp('2020-05-01', tz="US/Eastern").

    【讨论】:

    • 更有可能是“UTC”
    • 谢谢,我猜这是财务数据,往往是东部时间...
    • 这不是重点:parquet 以 UTC 格式存储所有内容。这可能取决于写入数据的框架,以及是否存在任何时区元数据。
    • Parquet 和 Arrow(在此处帮助过滤)都以 UTC 格式存储所有时间戳。话虽如此,在定义文字时,您可能仍希望使用 UTC 以外的其他内容。该文字的 UTC 表示将在引擎盖下用于比较。例如,如果这些是交易并且您希望所有交易发生在 5 月,在纽约,您将指定东部时间。现在,如果您想要在记录数据的时区中发生在 5 月的所有交易,那么您就不走运了。这里没有足够的信息。
    • 谢谢。我想一种解决方法是指定更宽的频带并在数据进入内存后进行一些进一步的过滤......
    猜你喜欢
    • 1970-01-01
    • 2022-07-16
    • 2013-10-20
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2018-01-25
    相关资源
    最近更新 更多