在 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”的操作都被矢量化。
简短回答: 我错过了什么吗?是的,“时间”和“时区”部分。 当我想要减去或添加时间增量以确保其矢量化时,是否必须将所有 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 对象,因此,您可以在没有警告的情况下执行矢量化操作。