Как преобразовать маятник в тип datetime.datetime?
В текущей части системы используется маятник v1.4, но с croniter он вызывает ошибку, описанную в https://github.com/sdispater/pendulum/issues/214
Это прекрасно работает с типом datetime.datetime, и мне все еще нужно остаться с маятником v1.4.
Поэтому я ищу решение, как эффективно преобразовать маятник в тип datetime.datetime?
Уже пробовал форматировать маятник как строку и анализировать с помощью dateutil.parser.
5 ответов
Еще один взгляд на это:
>>> from datetime import datetime
>>> import pendulum
>>> datetime.fromtimestamp(pendulum.now().timestamp())
datetime.datetime(2019, 3, 20, 16, 32, 24, 172283)
Но, на самом деле, в этом нет необходимости: pendulum
"s DateTime
наследует от datetime.datetime
поэтому любой код работает с stdlib datetime
должно работать так же.
Я не мог найти помощника маятника для этого. Итак, вернемся к основам:
import datetime as dt
tz_info = dateutil.tz.gettz(zone_name)
pend_time = pendulum.datetime(...)
dt_time = dt.datetime(
pend_time.year,
pend_time.month,
pend_time.day,
pend_time.hour,
pend_time.minute,
pend_time.second,
pend_time.microsecond,
).astimezone(tz_info)
Обратите внимание на использование dateutil. Начиная с Python 3.6 в документации tzinfo рекомендуется использовать dateutil.tz, а не pytz в качестве поставщика часового пояса IANA.
Маятниковые объекты имеют охраняемые
_datetime
член:
import pendulum
p = pendulum.now()
p._datetime
Это даст вам что-то вроде
datetime.datetime(2021, 5, 24, 12, 44, 11, 812937, tzinfo=<TimezoneInfo [America/New_York, EDT, -4:00:00, DST]>)
У меня работает следующий код:
In [1]: import pendulum
In [2]: import datetime
In [3]: pdt = pendulum.now()
In [4]: datetime.datetime.fromisoformat(pdt.to_iso8601_string())
Out[4]: datetime.datetime(2022, 2, 22, 14, 29, 36, 812772,tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))
Использовать модуль стрелки для преобразования маятника в дату и время
>>> arrow.get(datetime(2013, 5, 5), 'US/Pacific')
<Arrow [2013-05-05T00:00:00-07:00]>
пример:
In [90]: import numpy as np
...: import pandas as pd
...: import pendulum
...: import arrow
...:
...: def pendulum_to_datetime(x):
...: return arrow.get(x, x.tz.name).datetime
In [91]: dates = [pendulum.datetime(2011, 1, 2, tz='Asia/Seoul'),
...: pendulum.datetime(2011, 1, 5, tz='Asia/Seoul'),
...: pendulum.datetime(2011, 1, 7, tz='Asia/Seoul')]
In [92]: dates
Out[92]:
[DateTime(2011, 1, 2, 0, 0, 0, tzinfo=Timezone('Asia/Seoul')),
DateTime(2011, 1, 5, 0, 0, 0, tzinfo=Timezone('Asia/Seoul')),
DateTime(2011, 1, 7, 0, 0, 0, tzinfo=Timezone('Asia/Seoul'))]
In [93]: dates2 = [pendulum_to_datetime(x) for x in dates]
In [94]: dates2
Out[94]:
[datetime.datetime(2011, 1, 2, 0, 0, tzinfo=tzfile('ROK')),
datetime.datetime(2011, 1, 5, 0, 0, tzinfo=tzfile('ROK')),
datetime.datetime(2011, 1, 7, 0, 0, tzinfo=tzfile('ROK'))]
In [95]: s1 = pd.Series(np.random.randn(3), index=dates2)
In [96]: s1
Out[96]:
2011-01-02 00:00:00+09:00 -0.359771
2011-01-05 00:00:00+09:00 -0.208608
2011-01-07 00:00:00+09:00 -0.051233
dtype: float64
In [97]: s1.index
Out[97]:
DatetimeIndex(['2011-01-02 00:00:00+09:00', '2011-01-05 00:00:00+09:00',
'2011-01-07 00:00:00+09:00'],
dtype='datetime64[ns, tzfile('ROK')]', freq=None)
In [98]: s2 = pd.Series(dates2)
In [99]: s2
Out[99]:
0 2011-01-02 00:00:00+09:00
1 2011-01-05 00:00:00+09:00
2 2011-01-07 00:00:00+09:00
dtype: datetime64[ns, tzfile('ROK')]