【问题标题】:How to filter a polars dataframe by date?如何按日期过滤极地数据框?
【发布时间】:2023-01-24 11:10:22
【问题描述】:
df.filter(pl.col("MyDate") >= "2020-01-01")

不像在熊猫中那样工作。

我找到了解决方法

df.filter(pl.col("MyDate") >= pl.datetime(2020,1,1))

但是如果我需要使用字符串变量,这并不能解决问题。

【问题讨论】:

    标签: python python-polars


    【解决方案1】:

    您可以使用 python datetime 对象。它们将被转换为极坐标 literal 表达式。

    import polars as pl
    from datetime import datetime
    
    pl.DataFrame({
        "dates": [datetime(2021, 1, 1), datetime(2021, 1, 2), datetime(2021, 1, 3)],
        "vals": range(3)
    }).filter(pl.col("dates") > datetime(2021, 1, 2))
    

    或者用显式语法:pl.col("dates") > pl.lit(datetime(2021, 1, 2))

    【讨论】:

      【解决方案2】:

      使用pl.lit(my_date_str).str.strptime(pl.Date, fmt=my_date_fmt))

      基于上面的示例:

      import polars as pl
      from datetime import datetime
      
      df=pl.DataFrame({
          "dates": [datetime(2021, 1, 1), datetime(2021, 1, 2), datetime(2021, 1, 3)],
          "vals": range(3)
      })
      
      my_date_str="2021-01-02"
      my_date_fmt="%F"
      df.filter(pl.col('dates') >= pl.lit(my_date_str).str.strptime(pl.Date, fmt=my_date_fmt))
      
      shape: (2, 2)
      ┌─────────────────────┬──────┐
      │ dates               ┆ vals │
      │ ---                 ┆ ---  │
      │ datetime[μs]        ┆ i64  │
      ╞═════════════════════╪══════╡
      │ 2021-01-02 00:00:00 ┆ 1    │
      ├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┤
      │ 2021-01-03 00:00:00 ┆ 2    │
      └─────────────────────┴──────┘
      

      请确保将格式与您的日期字符串相匹配。例如,

      my_date_str="01/02/21"
      my_date_fmt="%D"
      

      我无法谈论这种方法的性能,但它提供了一种将字符串变量合并到代码中的简单方法。

      【讨论】:

        【解决方案3】:

        稍微整洁的代码的 Hacky 解决方法:只需使用 pandas!

        pd.to_datetime 采用单个字符串,通过使用我自己的数据以及您的示例进行测试,polars 非常乐意使用它返回的 pandas datetime 对象。

        如果从 pandas 导入对你来说是不可能的,那么这是没用的,但如果你想要简单的字符串到日期转换...... why not use pandas for what it's good at? :P

        import polars as pl
        from datetime import datetime
        from pandas import to_datetime # or just import pandas as pd
        
        df = pl.DataFrame({
            "dates": [datetime(2021, 1, 1), datetime(2021, 1, 2), datetime(2021, 1, 3)],
            "vals": range(3)
        })
        
        my_date_str = "2021-01-02"
        my_date = to_datetime(my_date_str) # or use pd.to_datetime
        print(df.filter(pl.col('dates') >= my_date))
        

        产生:

        shape: (2, 2)
        ┌─────────────────────┬──────┐
        │ dates               ┆ vals │
        │ ---                 ┆ ---  │
        │ datetime[μs]        ┆ i64  │
        ╞═════════════════════╪══════╡
        │ 2021-01-02 00:00:00 ┆ 1    │
        │ 2021-01-03 00:00:00 ┆ 2    │
        └─────────────────────┴──────┘
        

        【讨论】:

          猜你喜欢
          • 2019-11-27
          • 1970-01-01
          • 2021-01-16
          • 2018-09-29
          • 2016-08-03
          • 1970-01-01
          • 1970-01-01
          • 2018-06-17
          相关资源
          最近更新 更多