为什么从 pandas.date 中减去 pandas.timedelta 没有矢量化?

问题描述 投票:0回答:1

在 Pandas 2.2 上运行此命令,仅当从日期中减去 timedelta 但不从日期时间中减去 timedelta 时,我才会看到性能警告:

import pandas as pd

s1 = pd.DataFrame({"year": [2015, 2016], "month": [2, 3], "day": [4, 5]})
s1 = pd.to_datetime(s1)


df = pd.DataFrame(s1)
df = df.rename(columns={0: "t1", 1: "t2"})
df["day"] = df["t1"].dt.date
df["n"] = pd.to_timedelta(df["t1"].dt.day_of_week)

# Throws a not vectorized warning
df["week"] = df["day"] - df["n"]

# No warnings is it actually vectorized?
df["week2"] = df["t1"] - df["n"]
df["week2"] = df["week2"].dt.date

print(df[["week", "week2"]])

我错过了什么吗? 当我想要减去或添加时间增量以确保其矢量化时,是否必须将所有 pd.date 列转换为 pd.datetime?

我希望列“week”和“week2”的操作都被矢量化。

pandas performance datetime query-optimization
1个回答
0
投票

简短回答: 我错过了什么吗?是的,“时间”和“时区”部分。 当我想要减去或添加时间增量以确保其矢量化时,是否必须将所有 pd.date 列转换为 pd.datetime ?是的,你必须转换为日期时间类型(你可以直接使用 df["t1"] 上的原始类型)。

长答案: 如果你执行

dt.date
你实际上会得到一个 python datetime.date 对象的数组(只有时间戳的日期部分,没有时间和时区信息)(如 https://pandas.pydata.org/pandas- 中所述)文档/稳定/参考/api/pandas.Series.dt.date.html)。因此,由于它只是日期时间的一部分,因此它被识别为一种 pandas 对象数据类型,并且矢量化操作无法将其识别为整个日期时间值,因此它会抛出警告(即使它可能会在差异中带来错误的值)因为它不考虑“时间”和“时区”)。

另一方面,您的 df["t1"] 是 pandas datetime 对象,df["n"] 是 pandas timedelta 对象,因此,您可以在没有警告的情况下执行矢量化操作。

© www.soinside.com 2019 - 2024. All rights reserved.