首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pytz时区转换性能

pytz时区转换性能
EN

Stack Overflow用户
提问于 2015-11-04 21:35:16
回答 1查看 965关注 0票数 1

我有100多万个数据库中的datetime对象,我想将每个对象转换为时区感知的datetime对象。这是我的助手conv_tz:

代码语言:javascript
复制
# dt is python datetime object, src_tz and dest_tz and pytz.timezone objects
def conv_tz(dt, src_tz, dest_tz):
    if not dt: return None
    sdt = src_tz.localize(dt)
    return sdt.astimezone(dest_tz)

下面是分析器的结果:

代码语言:javascript
复制
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
1101475    1.166    0.000   44.440    0.000 ../release/python/lib/dtutil.py:128(conv_tz)
1101475    9.092    0.000   35.656    0.000 /app/python/lib/python3.4/site-packages/pytz/tzinfo.py:244(localize)

问题1:是否有办法让它跑得更快?数据库中的每个datetime对象都假定在pytz.timezone(‘America/New York’)中,并且目标时区因每个日期时间对象(或数据库中的每一行)而不同。

事实上,在我得到时区感知的datetime对象之后,我真正想要实现的是将这些datetime对象转换为matlab time (而不是时区感知的)。下面是我使用的to_mat函数:

代码语言:javascript
复制
def to_mat(dt):
    if not dt:  return None
    val = dt.toordinal() + 366
    t = dt.time()
    return val + (((t.hour * 60) + t.minute) * 60 + t.second) / float(_seconds_day) + t.microsecond / 1.0e6 / _seconds_day

对于100多万个日期时间对象,我将这两个函数一起调用:

代码语言:javascript
复制
matdt = dtutil.to_mat(dtutil.conv_tz(dt, pytz.timezone('America/New_York'), dst_tz))

Question2:也许有更好的方法来一起进行这些转换?下面是to_mat的分析器,它似乎比conv_tz更省时:

代码语言:javascript
复制
3304425    5.067    0.000    5.662    0.000 ../release/python/lib/dtutil.py:8(to_mat)

环境: CentOS6 x64 + Python3.4.3 x64

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-09 14:23:00

谢谢J.F.塞巴斯蒂安的评论!下面是我决定使用的内容,假设这些数据对象的默认时区与OS时区一致:

代码语言:javascript
复制
def conv_tz2(dt, dest_tz):
    if not dt: return None
    return datetime.fromtimestamp(dt.timestamp(), dest_tz)

它运行着原始conv_tz的一小部分。下面是一个基于50万转换的测试:

代码语言:javascript
复制
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
567669    0.664    0.000   23.354    0.000 ../test/test_tz.py:17(conv_tz)
567669    4.831    0.000   18.732    0.000 /app/python/lib/python3.4/site-packages/pytz/tzinfo.py:244(localize)
567669    0.472    0.000    5.786    0.000 ../test/test_tz.py:22(conv_tz2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33532457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档