изменение часового пояса воздушного потока с UTC на CET - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу запустить dag в потоке воздуха, дата выполнения которого должна быть в CET, но по умолчанию AIRFLOW выполняется в UTC ... и поэтому, если я хочу использовать значение TS или EXECUTION_DATE в переменной ... он показываеттекущее время в UTC. Как узнать дату выполнения в часовом поясе CET

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018
EXEC_DATE = "{{ (execution_date + macros.timedelta(hours=1)).strftime('%Y%m%d%H%M')}}"

Это добавит один час к {{ts}} и будет работать как CET:)

0 голосов
/ 17 декабря 2018

В текущих версиях Airflow (1.10.x) им требуется модуль маятник , поскольку существует ограниченная поддержка планирования с учетом часового пояса .

.значения макросов TS и EXECUTION_DATE установлены (iirc) на часовой пояс UTC системы Airflow, потому что это то, во что Airflow преобразует все при сохранении в БД и отображении пользовательского интерфейса.Вы, возможно, ожидали, что изменение этого в конфигурации:

[core]
default_timezone = utc

может повлиять на это, но, похоже, это повлияет только на понимание времени наивной даты (например, если вы установите DAG start_date на Datetime(2018,12,25), это будетпредполагается, что он находится в default_timezone)

Вы можете преобразовать execution_date в DAG в PythonOperator следующим образом:

import pendulum

desired_tz = pendulum.timezone("Europe/Amsterdam")
desired_tz.convert(execution_date)

Поскольку execution_date уже будет знать, что это в UTCпреобразование должно быть точным.Обратите внимание, что это ни к чему не привязывает и не меняет execution_date.

Вот что происходит, если вы работаете с местным временем (неизвестный часовой пояс):

>>> import pendulum
>>> dtz=pendulum.timezone("Europe/Amsterdam")
>>> dtz
Timezone('Europe/Amsterdam')
>>> import datetime
>>> d=datetime.datetime.now()
>>> d
datetime.datetime(2018, 12, 17, 17, 36, 5, 435666)
>>> dtz.convert(d)  # Notice unchanged
datetime.datetime(2018, 12, 17, 17, 36, 5, 435666, tzinfo=Timezone('Europe/Amsterdam'))
>>> d
datetime.datetime(2018, 12, 17, 17, 36, 5, 435666)
>>> dtz.convert(pendulum.timezone("UTC").convert(d))  # Notice changed
datetime.datetime(2018, 12, 17, 18, 36, 5, 435666, fold=1, tzinfo=Timezone('Europe/Amsterdam'))
>>> d  # Notice change not assigned
datetime.datetime(2018, 12, 17, 17, 36, 5, 435666)

Итак ... Я надеюсьэто помогает, потому что CET имеет переменное смещение относительно UTC IIRC.

0 голосов
/ 15 декабря 2018

Существует классная библиотека, называемая стрелкой, которую можно использовать для преобразования времени из одного часового пояса в другой

>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2018-12-15T20:50:33.156717+00:00]>
>>> local = utc.to('CET')
>>> local
<Arrow [2018-12-15T21:50:33.156717+01:00]>

Способ только с встроенными библиотеками

>>> import dateutil.parser
>>> import timedelta
>>> ts = "201812160105"
>>> date = dateutil.parser.parse(ts)
datetime.datetime(2018, 12, 16, 1, 5)
>>> cet_ts = ts + timedelta(hours=1) # UTC + 1 hour = CET
datetime.datetime(2018, 12, 16, 2, 5)

иесли вы хотите вернуть его в формате ISO

>>> cet_ts.isoformat()
'2018-12-16T02:05:00'

Редактировать:

Чтобы преобразовать строку в формате ISO 8601, вы можете использовать следующую команду

>>> ts = '2018-12-15T21:10:00+00:00'
>>> arrow.get(ts)
<Arrow [2018-12-15T21:10:00+00:00]>

и чтобы преобразовать дату из UTC в CET, просто запустите

>>> utc.to('CET')
<Arrow [2018-12-15T22:10:00+01:00]>
...