python - 在 python 中为大型数据集本地化时间的快速方法?
问题描述
我将 datetime 对象作为 pandas 数据框中的索引,我想在不使用 for 循环的情况下对其进行本地化。这是代码:(数据是数据框)
from pytz import timezone
utc = timezone('UTC')
utc_times = [utc.localize(entry) for entry in data.index]
cst_times = [entry.astimezone(timezone('US/Central')) for entry in utc_times]
data.index = cst_times
随着数据集的增长,这会变慢。有什么方法可以加快速度吗?
解决方案
如果您的索引是 a DateTimeIndex
,您应该可以这样做:
import pandas as pd
times = pd.DatetimeIndex(start='2018-04-26 11:00:00', periods=50000, freq='1h')
data = pd.DataFrame(index=times)
utc_times = data.index.tz_localize('UTC')
cst_times = utc_times.tz_convert('US/Central')
data.index = cst_times
对于 50,000 次的索引,此方法的速度提高了 1000 倍以上。见下文:
%% time
# Original method
utc_times = [utc.localize(entry) for entry in data.index]
cst_times = [entry.astimezone(timezone('US/Central')) for entry in utc_times]
data.index = cst_times
CPU times: user 1.28 s, sys: 38.2 ms, total: 1.32 s
Wall time: 1.49 s
--
%%time
# New method
utc_times = data.index.tz_localize('UTC')
cst_times = utc_times.tz_convert('US/Central')
data.index = cst_times
CPU times: user 354 µs, sys: 9 µs, total: 363 µs
Wall time: 389 µs
推荐阅读
- django - 我可以从单个 Django 函数中分别返回模板和变量吗?
- azure - 使用 Redisson 和 Azure Redis 缓存遇到 RedisTimeoutException 和其他异常
- docker - 如何将 CA 根证书添加到 Jenkins Docker 容器上的 LDAP 密钥库?
- javascript - 向赛普拉斯配置添加第三方 cookie 例外
- xml - Azure 部署:错误 MSB4041:项目的默认 XML 命名空间必须是 MSBuild XML 命名空间
- python - 将计数器列表转换为稀疏 Pandas DataFrame
- excel - 粘贴在 Excel 中转置的形状
- java - 我的 if 语句是否会影响我的菜单?
- google-apps-script - 使用谷歌应用程序脚本将谷歌表格上的列增加 1?
- python - 在多个主机上通过 Ansible 运行 yum update 不工作