我怎样才能加快这个 UTC 转换过程?
How can I speed up this UTC conversion process?
我想将 Datetime
的范围转换为 UTC 时区。 500_000 个条目的以下代码需要三分多钟。
我怎样才能加快这个过程?
import datetime
from pytz import timezone
import pytz
import pandas as pd
import time
abc = pd.date_range(start='2020-03-28 05:00:00', periods=500_000, freq='5min')
UTC = pytz.timezone('UTC')
BERLIN = pytz.timezone('Europe/Berlin')
print("abc[0]=\n", abc[0])
print("abc[-1]=\n", abc[-1])
myList = []
my_time = time.time()
for runner in abc:
localizedToBerlin = BERLIN.localize(runner)
localizedToBerlinAsUtc = localizedToBerlin.astimezone(UTC)
myList.append([runner, localizedToBerlinAsUtc])
print('runtime:', time.time() - my_time)
结果:
abc[0]=
2020-03-28 05:00:00
abc[-1]=
2024-12-28 07:35:00
runtime: 209.57262253761292
pandas 内置 - 如果你工作 with/in pandas
,尽量避免循环并使用内置插件,例如tz_convert
。从 Europe/Berlin 到 UTC:
import pandas as pd
dr = pd.date_range(start='2020-03-28 05:00:00', periods=500_000, freq='5min',
tz='Europe/Berlin')
%timeit dr.tz_convert('UTC')
77.2 µs ± 1.4 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
本地化从天真到 Europe/Berlin 再到 UTC:
dr = pd.date_range(start='2020-03-28 05:00:00', periods=500_000, freq='5min')
%timeit dr.tz_localize('Europe/Berlin', nonexistent='NaT', ambiguous='NaT').tz_convert('UTC')
69.5 ms ± 191 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
UTC first - 另请注意,将 naive 本地化到 UTC 和 then[=42 要快得多=] 转换为另一个时区 - UTC 本地化不涉及计算 DST 更改等。
dr = pd.date_range(start='2020-03-28 05:00:00', periods=500_000, freq='5min')
%timeit dr.tz_localize('UTC').tz_convert('Europe/Berlin')
173 µs ± 2.51 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
使用列表 - 如果您不使用 pandas
数据结构或类似的并且必须使用列表,本地化到 UTC 然后到另一个时区仍然执行(相对)好:
import pytz
l = dr.to_list()
l_utc = list(map(pytz.utc.localize, l))
# %timeit list(map(pytz.utc.localize, l))
# 1.44 s ± 7.72 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
cet = pytz.timezone('Europe/Berlin') # CEST at the moment
l_cet = list(map(lambda t: t.astimezone(cet), l_utc))
# %timeit list(map(lambda t: t.astimezone(cet), l_utc))
# 3.24 s ± 10.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
直接从幼稚到某个时区仍然是痛苦 pytz
:
%timeit list(map(cet.localize, l))
2min 9s ± 7.31 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
dateutil vs. pytz - 这里的替代方法是使用 dateutil
- 因为它使用与 Python 相同的时区模型,你可以使用 replace()
:
import dateutil
d_cet = dateutil.tz.gettz('Europe/Berlin')
%timeit [t.replace(tzinfo=d_cet) for t in l]
5.67 s ± 357 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
我想将 Datetime
的范围转换为 UTC 时区。 500_000 个条目的以下代码需要三分多钟。
我怎样才能加快这个过程?
import datetime
from pytz import timezone
import pytz
import pandas as pd
import time
abc = pd.date_range(start='2020-03-28 05:00:00', periods=500_000, freq='5min')
UTC = pytz.timezone('UTC')
BERLIN = pytz.timezone('Europe/Berlin')
print("abc[0]=\n", abc[0])
print("abc[-1]=\n", abc[-1])
myList = []
my_time = time.time()
for runner in abc:
localizedToBerlin = BERLIN.localize(runner)
localizedToBerlinAsUtc = localizedToBerlin.astimezone(UTC)
myList.append([runner, localizedToBerlinAsUtc])
print('runtime:', time.time() - my_time)
结果:
abc[0]=
2020-03-28 05:00:00
abc[-1]=
2024-12-28 07:35:00
runtime: 209.57262253761292
pandas 内置 - 如果你工作 with/in pandas
,尽量避免循环并使用内置插件,例如tz_convert
。从 Europe/Berlin 到 UTC:
import pandas as pd
dr = pd.date_range(start='2020-03-28 05:00:00', periods=500_000, freq='5min',
tz='Europe/Berlin')
%timeit dr.tz_convert('UTC')
77.2 µs ± 1.4 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
本地化从天真到 Europe/Berlin 再到 UTC:
dr = pd.date_range(start='2020-03-28 05:00:00', periods=500_000, freq='5min')
%timeit dr.tz_localize('Europe/Berlin', nonexistent='NaT', ambiguous='NaT').tz_convert('UTC')
69.5 ms ± 191 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
UTC first - 另请注意,将 naive 本地化到 UTC 和 then[=42 要快得多=] 转换为另一个时区 - UTC 本地化不涉及计算 DST 更改等。
dr = pd.date_range(start='2020-03-28 05:00:00', periods=500_000, freq='5min')
%timeit dr.tz_localize('UTC').tz_convert('Europe/Berlin')
173 µs ± 2.51 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
使用列表 - 如果您不使用 pandas
数据结构或类似的并且必须使用列表,本地化到 UTC 然后到另一个时区仍然执行(相对)好:
import pytz
l = dr.to_list()
l_utc = list(map(pytz.utc.localize, l))
# %timeit list(map(pytz.utc.localize, l))
# 1.44 s ± 7.72 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
cet = pytz.timezone('Europe/Berlin') # CEST at the moment
l_cet = list(map(lambda t: t.astimezone(cet), l_utc))
# %timeit list(map(lambda t: t.astimezone(cet), l_utc))
# 3.24 s ± 10.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
直接从幼稚到某个时区仍然是痛苦 pytz
:
%timeit list(map(cet.localize, l))
2min 9s ± 7.31 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
dateutil vs. pytz - 这里的替代方法是使用 dateutil
- 因为它使用与 Python 相同的时区模型,你可以使用 replace()
:
import dateutil
d_cet = dateutil.tz.gettz('Europe/Berlin')
%timeit [t.replace(tzinfo=d_cet) for t in l]
5.67 s ± 357 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)