在Polars中的select语句中将column转换为Numpy

z5btuh9x  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(79)

我尝试将日期列转换为每个日期之后的下一个工作日(如果日期不是工作日,则保持不变)。为此,我使用了一个名为busday_offset的Numpy函数,它将Numpy数组作为第一个参数。下面的代码行不起作用,因为pl.col('creation_date')不是Polars列,而是某种抽象对象。因此,不能在其上调用“.to_numpy”将列转换为numpy数组。

sales_orders.with_columns(
    [
        pl.lit(np.busday_offset(pl.col('creation_date').to_numpy(), 0, roll='forward'))
    ]
)

字符串
-> AttributeError:“Expr”对象没有属性“to_numpy”
我知道一个解决方法是在“sales_orders”表上使用“.get_column”方法,如下所示:

sales_orders.with_columns(
    [
        pl.lit(np.busday_offset(sales_orders.get_column('creation_date').to_numpy(), 0, roll='forward'))
    ]
)


但这缺乏优雅性,并且不可能像这样嵌套“with_columns”语句:

sales_orders.with_columns(
    [
        pl.lit(np.busday_offset(sales_orders.get_column('creation_date'), 0, roll='forward')).alias('order_acknowledgement_date')
    ]
).with_columns(
    [
        pl.lit(np.busday_offset(sales_orders.get_column('order_acknowledgement_date'), 2, roll='forward')).alias('ship_due_date')
    ]
)


-> ColumnNotFoundError:order_acknowledgement_date这确实不起作用,因为“order_acknowledgement_date”不是“sales_orders”表的一部分。

我的问题是:如何在select/with_columns语句中将pl.col('creation_date')转换为Numpy数组,而不直接引用sales_orders表?

yshpjwxd

yshpjwxd1#

***更新:**Polars现在可以理解numpy.datetime64对象,截至v0.18.7

可以使用.map()

df = pl.DataFrame({"date": ["2011-03-20", "2011-03-22", "2011-03-24"]})
df = df.with_columns(pl.col("date").str.to_date())

df.with_columns(busday = 
   pl.col("date").map(lambda date: 
      pl.Series(np.busday_offset(date, 0, roll="forward"))
   )
)

个字符

相关问题