从不知道到知道时,在 pytz 中使用 localize 而不是 astimezone 是否有任何好处
Is there every a benefit to use localize instead of astimezone in pytz when going from unaware to aware
我正在使用 pytz 在 Python 中将非时区感知日期时间转换为时区感知日期时间。
astimezone
似乎比 localize
快 3 倍以上。
有没有理由使用 localize
而不是 astimezone
?
-------- Trial Name: Convert nonaware datetimes to timezone aware via localize
Totaltime: 1.854642400s
Time per loop: 18.546us
-------- Trial Name: Convert nonaware datetimes to timezone aware via astimezone
Totaltime: 0.584159600s
Time per loop: 5.842us
在 Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz 2.81 GHz, 16GB ram 运行 Windows 10 Home 上完成的试验。
import timeit
numberOfTrials = 100000
def myTimeit(trialName, mysetup, mycode, numberOfTrials):
print(f'-------- Trial Name: {trialName}')
# timeit statement
totalTime = timeit.timeit(setup=mysetup,
stmt=mycode,
number=numberOfTrials)
print(f"Totaltime: {totalTime:0,.9f}s")
print(f"Time per loop: {totalTime / numberOfTrials * 1e6:0.3f}us")
print()
return totalTime
mysetup = '''
from datetime import datetime
import pytz
notTimezoneAware_datetime = datetime.strptime("220105 230310", '%y%m%d %H%M%S')
TOKYO_tz = pytz.timezone('Asia/Tokyo')
'''
myTimeit(trialName='Convert nonaware datetimes to timezone aware via localize',
mysetup=mysetup,
mycode='TOKYO_tz.localize(notTimezoneAware_datetime)',
numberOfTrials=numberOfTrials)
myTimeit(trialName='Convert nonaware datetimes to timezone aware via astimezone',
mysetup=mysetup,
mycode='notTimezoneAware_datetime.astimezone(TOKYO_tz)',
numberOfTrials=numberOfTrials)
为了澄清我的评论,
localize
为原始日期时间对象设置时区。它不会改变对象的属性(date/time)
astimezone
接受给定的日期时间对象,天真或有意识,并将 date/time 转换为所需的时区。如果 datetime 对象是朴素的,则假定为当地时间。
前:
from datetime import datetime
import pytz
# just localize to a certain time zone.
pytz.timezone("America/Denver").localize(datetime(2022, 5, 15))
Out[3]: datetime.datetime(2022, 5, 15, 0, 0, tzinfo=<DstTzInfo 'America/Denver' MDT-1 day, 18:00:00 DST>)
# convert to the desired time zone; note that my local time zone is UTC+2
# US/Denver is at UTC-6 on May 15th 2022, so total shift is 8 hours:
datetime(2022, 5, 15).astimezone(pytz.timezone("America/Denver"))
Out[4]: datetime.datetime(2022, 5, 14, 16, 0, tzinfo=<DstTzInfo 'America/Denver' MDT-1 day, 18:00:00 DST>)
回答问题:没有,没有任何好处。您正在处理具有不同目的的方法。
附带说明一下,Python 3.9+ 标准库实际上提供了一个好处:
from zoneinfo import ZoneInfo
%timeit pytz.timezone("America/Denver").localize(datetime(2022, 5, 15))
16.8 µs ± 30.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit datetime(2022, 5, 15).replace(tzinfo=ZoneInfo("America/Denver"))
1.19 µs ± 5.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
我正在使用 pytz 在 Python 中将非时区感知日期时间转换为时区感知日期时间。
astimezone
似乎比 localize
快 3 倍以上。
有没有理由使用 localize
而不是 astimezone
?
-------- Trial Name: Convert nonaware datetimes to timezone aware via localize
Totaltime: 1.854642400s
Time per loop: 18.546us
-------- Trial Name: Convert nonaware datetimes to timezone aware via astimezone
Totaltime: 0.584159600s
Time per loop: 5.842us
在 Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz 2.81 GHz, 16GB ram 运行 Windows 10 Home 上完成的试验。
import timeit
numberOfTrials = 100000
def myTimeit(trialName, mysetup, mycode, numberOfTrials):
print(f'-------- Trial Name: {trialName}')
# timeit statement
totalTime = timeit.timeit(setup=mysetup,
stmt=mycode,
number=numberOfTrials)
print(f"Totaltime: {totalTime:0,.9f}s")
print(f"Time per loop: {totalTime / numberOfTrials * 1e6:0.3f}us")
print()
return totalTime
mysetup = '''
from datetime import datetime
import pytz
notTimezoneAware_datetime = datetime.strptime("220105 230310", '%y%m%d %H%M%S')
TOKYO_tz = pytz.timezone('Asia/Tokyo')
'''
myTimeit(trialName='Convert nonaware datetimes to timezone aware via localize',
mysetup=mysetup,
mycode='TOKYO_tz.localize(notTimezoneAware_datetime)',
numberOfTrials=numberOfTrials)
myTimeit(trialName='Convert nonaware datetimes to timezone aware via astimezone',
mysetup=mysetup,
mycode='notTimezoneAware_datetime.astimezone(TOKYO_tz)',
numberOfTrials=numberOfTrials)
为了澄清我的评论,
localize
为原始日期时间对象设置时区。它不会改变对象的属性(date/time)astimezone
接受给定的日期时间对象,天真或有意识,并将 date/time 转换为所需的时区。如果 datetime 对象是朴素的,则假定为当地时间。
前:
from datetime import datetime
import pytz
# just localize to a certain time zone.
pytz.timezone("America/Denver").localize(datetime(2022, 5, 15))
Out[3]: datetime.datetime(2022, 5, 15, 0, 0, tzinfo=<DstTzInfo 'America/Denver' MDT-1 day, 18:00:00 DST>)
# convert to the desired time zone; note that my local time zone is UTC+2
# US/Denver is at UTC-6 on May 15th 2022, so total shift is 8 hours:
datetime(2022, 5, 15).astimezone(pytz.timezone("America/Denver"))
Out[4]: datetime.datetime(2022, 5, 14, 16, 0, tzinfo=<DstTzInfo 'America/Denver' MDT-1 day, 18:00:00 DST>)
回答问题:没有,没有任何好处。您正在处理具有不同目的的方法。
附带说明一下,Python 3.9+ 标准库实际上提供了一个好处:
from zoneinfo import ZoneInfo
%timeit pytz.timezone("America/Denver").localize(datetime(2022, 5, 15))
16.8 µs ± 30.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit datetime(2022, 5, 15).replace(tzinfo=ZoneInfo("America/Denver"))
1.19 µs ± 5.83 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)