消除pytz zone属性警告,获取本地时区过滤指定时间数据
消除pytz时区警告并实现跨时区本地时间数据筛选
问题背景
- 收到警告:
zone属性是pytz接口特有的;请迁移到新的时区提供者。 - 核心需求:基于本地时间筛选当日且不早于2小时前的数据,代码需适配不同时区(跨地区出差场景)。
- 现有代码问题:依赖pytz专属
zone属性,且日期时间处理效率较低。
解决方案
1. 替换时区获取方式(消除警告核心)
Python 3.9+推荐使用标准库zoneinfo配合tzlocal获取本地时区,完全避开pytz的专属属性:
from datetime import datetime, timedelta from tzlocal import get_localzone import pandas as pd # 获取兼容标准库的本地时区对象,无需依赖pytz local_tz = get_localzone()
若使用Python 3.8及以下版本,先安装兼容库:
pip install backports.zoneinfo
再导入替代标准库:
from backports.zoneinfo import ZoneInfo
2. 优化日期时间转换与筛选逻辑
原代码逐行处理效率低,且重复计算当前时间,优化后更简洁高效:
# 1. 批量合并DATA和HORA列,直接转为带本地时区的datetime df['DATA_HORA'] = pd.to_datetime(df['DATA'] + ' ' + df['HORA'], format='%d/%m/%Y %H:%M').dt.tz_localize(local_tz) # 2. 一次性计算筛选所需的时间阈值 now_local = datetime.now(local_tz) two_hours_ago = now_local - timedelta(hours=2) today_date = now_local.date() # 3. 筛选符合条件的数据 df_today = df[ (df['DATA_HORA'].dt.date == today_date) & (df['DATA_HORA'] >= two_hours_ago) ]
关键说明
- 用
pd.to_datetime批量处理日期时间,比apply+strptime效率提升数倍。 - 直接使用
tzlocal返回的时区对象,彻底避免访问pytz专属的zone属性,消除警告。 - 提前计算阈值变量,避免重复调用
datetime.now(),减少不必要的计算开销。
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

