0

0

优化Pandas自定义工作日偏移操作中的性能警告

DDD

DDD

发布时间:2025-10-27 12:48:05

|

381人浏览过

|

来源于php中文网

原创

优化Pandas自定义工作日偏移操作中的性能警告

本文探讨了在pandas中使用`custombusinessday`进行日期偏移时遇到的`performancewarning`问题及其解决方案。当直接将复杂的非向量化日期偏移应用于`series`或`datetimeindex`时,pandas会发出此警告。通过采用`series.apply()`方法结合lambda表达式,可以有效地避免警告,并确保自定义工作日逻辑的正确应用,从而提升代码的健壮性。

理解Pandas中的自定义工作日偏移

在数据分析中,我们经常需要对日期进行偏移操作,例如计算特定日期之后的下一个工作日。Pandas提供了强大的日期时间处理能力,其中包括pandas.tseries.offsets模块,该模块包含多种日期偏移量类型。CustomBusinessDay是一个特别有用的偏移量,它允许我们定义自己的工作日规则,例如排除周末和特定节假日。

以下是一个使用CustomBusinessDay来计算日期偏移的示例:

import pandas as pd
import numpy as np
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay
from datetime import datetime

# 初始化日期和偏移量参数
biz_day_only = True
offset_value = 1

# 定义美国联邦节假日日历
us_biz_days = CustomBusinessDay(calendar=USFederalHolidayCalendar())

# 创建一个DatetimeIndex
dt = pd.to_datetime(['20231231', '20231031'])

# 根据条件创建CustomBusinessDay或Day偏移量
if biz_day_only:
    # 注意:这里直接使用us_biz_days.holidays,因为CustomBusinessDay的calendar属性在创建后是不可变的,
    # 而holidays属性是实际的日期集合。
    d_offset = CustomBusinessDay(abs(offset_value), holidays=us_biz_days.holidays)
else:
    d_offset = pd.offsets.Day(abs(offset_value))

# 应用偏移量
if offset_value < 0:
    result_dt = dt - d_offset
else:
    result_dt = dt + d_offset

print("原始日期:", dt)
print("应用偏移量后的日期(可能出现警告):", result_dt)

当运行上述代码时,您可能会观察到如下的PerformanceWarning:

:1: PerformanceWarning: Non-vectorized DateOffset being applied to Series or DatetimeIndex.

这个警告表明,我们正在将一个非向量化的DateOffset对象(CustomBusinessDay)直接应用于一个Pandas Series或DatetimeIndex。由于CustomBusinessDay涉及到复杂的逻辑(例如跳过周末和节假日),Pandas无法将其优化为底层高效的向量化操作,因此会逐个元素地进行处理,这可能导致性能下降,尤其是在处理大量数据时。

尝试解决与NumPy的局限性

为了解决PerformanceWarning,一个常见的思路是尝试利用NumPy的向量化能力。例如,将Pandas日期转换为NumPy的datetime64类型,并尝试使用np.timedelta64进行偏移:

# 尝试使用NumPy偏移 (此方法不适用于CustomBusinessDay的复杂逻辑)
# new_dt = dt.values.astype('M8[D]') + np.timedelta64(d_offset, 'D') # 错误示例

这种方法的问题在于,np.timedelta64只能处理简单的固定时间间隔(如天、小时、分钟等)。如果尝试将d_offset(一个CustomBusinessDay对象)直接转换为np.timedelta64,或者使用d_offset.n属性(它只返回偏移的整数值,例如1),那么它将丢失CustomBusinessDay所包含的复杂业务逻辑,例如跳过节假日和周末。

例如,如果d_offset.n的值是1,那么np.timedelta64(1, 'D')只会简单地将日期向前推一天,而不会考虑这一天是否是工作日或节假日。这显然不符合我们使用CustomBusinessDay的初衷。因此,简单地转换为NumPy偏移量并不能解决问题,因为它会破坏业务逻辑的正确性。

NeoAgent
NeoAgent

销售易推出的AI‑CRM智能体平台

下载

推荐的解决方案:使用Series.apply()

解决PerformanceWarning并同时保持CustomBusinessDay复杂逻辑的正确性的最佳方法是使用Pandas Series或DatetimeIndex的apply()方法。apply()方法允许我们对Series中的每个元素应用一个自定义函数(通常是一个lambda表达式),从而实现逐元素的操作。

通过这种方式,CustomBusinessDay的逻辑可以正确地应用于每个日期,而不会触发PerformanceWarning,因为apply()本身就是设计来处理这种非向量化操作的。

import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay

# 初始化日期和偏移量参数
biz_day_only = True
offset_value = 1

# 定义美国联邦节假日日历
us_biz_days = CustomBusinessDay(calendar=USFederalHolidayCalendar())

# 创建一个DatetimeIndex
dt = pd.to_datetime(['20231231', '20231031', '20240101']) # 增加一个元旦日期进行测试

# 根据条件创建CustomBusinessDay或Day偏移量
if biz_day_only:
    d_offset = CustomBusinessDay(abs(offset_value), holidays=us_biz_days.holidays)
else:
    d_offset = pd.offsets.Day(abs(offset_value))

# 使用apply()方法应用偏移量
if offset_value < 0:
    new_dt = dt.apply(lambda x: x - d_offset)
else:
    new_dt = dt.apply(lambda x: x + d_offset)

print("原始日期:", dt)
print("使用apply()应用偏移量后的日期:", new_dt)

示例输出分析:

假设us_biz_days包含了2024年1月1日(元旦)作为节假日,并且2023年12月31日是周日。

  • 对于20231231 (周日),如果offset_value是1,那么CustomBusinessDay会跳过周日、周一(元旦),直接推到周二(2024年1月2日)。
  • 对于20231031 (周二),如果offset_value是1,那么CustomBusinessDay会推到周三(2023年11月1日)。
  • 对于20240101 (周一,元旦),如果offset_value是1,那么CustomBusinessDay会跳过周一(元旦),直接推到周二(2024年1月2日)。

通过dt.apply(lambda x: x + d_offset),每个日期元素x都会独立地与d_offset进行运算,CustomBusinessDay的复杂逻辑得以正确执行,并且不再出现PerformanceWarning。

注意事项与总结

  1. 正确性优先: 当处理像CustomBusinessDay这样包含复杂规则的日期偏移时,确保逻辑的正确性比单纯追求极致的向量化性能更为重要。Series.apply()提供了一个可靠的途径来保持这种正确性。
  2. 性能考量: 尽管apply()解决了警告并保证了正确性,但它本质上是一个循环操作。对于拥有数百万甚至更多日期的大型数据集,其性能可能不如真正的C级向量化操作。然而,对于大多数实际应用场景,apply()的性能通常是可接受的。
  3. Pandas发展: Pandas库在不断发展。未来版本可能会引入更高效的内部机制来处理复杂日期偏移的向量化操作。在当前版本中,apply()是处理此类PerformanceWarning的推荐实践。
  4. d_offset.n的用途: d_offset.n属性仅表示偏移量的整数部分(例如,CustomBusinessDay(3)的n为3)。它不包含任何关于工作日或节假日的逻辑信息,因此不能单独用于NumPy的timedelta64来模拟CustomBusinessDay的行为。

总之,当您在Pandas中遇到PerformanceWarning: Non-vectorized DateOffset being applied to Series or DatetimeIndex并涉及CustomBusinessDay等复杂日期偏移时,最佳实践是采用Series.apply()方法。这不仅能消除警告,更能确保您的日期偏移逻辑在考虑自定义工作日和节假日规则时保持完全的准确性。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

54

2025.12.04

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

50

2026.01.05

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

471

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

280

2023.08.07

网站建设功能有哪些
网站建设功能有哪些

网站建设功能包括信息发布、内容管理、用户管理、搜索引擎优化、网站安全、数据分析、网站推广、响应式设计、社交媒体整合和电子商务等功能。这些功能可以帮助网站管理员创建一个具有吸引力、可用性和商业价值的网站,实现网站的目标。

734

2023.10.16

数据分析网站推荐
数据分析网站推荐

数据分析网站推荐:1、商业数据分析论坛;2、人大经济论坛-计量经济学与统计区;3、中国统计论坛;4、数据挖掘学习交流论坛;5、数据分析论坛;6、网站数据分析;7、数据分析;8、数据挖掘研究院;9、S-PLUS、R统计论坛。想了解更多数据分析的相关内容,可以阅读本专题下面的文章。

512

2024.03.13

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

1

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 51.2万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号