11

在当前部分系统中使用了 pendulum v1.4,但使用 croniter 会导致https://github.com/sdispater/pendulum/issues/214中描述的错误

这适用于 datetime.datetime 类型,我仍然必须使用 pendulum v1.4。

所以我正在寻找如何有效地将钟摆转换为 datetime.datetime 类型的解决方案?

已经尝试将摆锤格式化为字符串并使用 dateutil.parser 进行解析。

4

5 回答 5

14

对此的另一种看法:

>>> from datetime import datetime
>>> import pendulum
>>> datetime.fromtimestamp(pendulum.now().timestamp(), pendulum.tz.UTC)
datetime.datetime(2021, 1, 12, 11, 41, 32, 387753, tzinfo=Timezone('UTC'))

通常不需要这样做,因为pendulum'DateTime继承自datetime.datetime. 任何与 stdlib 一起使用的代码datetime应该与 pendulum 一起使用。

于 2019-03-20T13:35:09.343 回答
3

我也找不到 Pendulum 帮手。所以,回到基础:

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 时区提供程序。

于 2019-02-20T23:06:48.140 回答
2

pendulum==1.4.0对象具有受保护的_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]>)

另一种方法如下: and works for pendulum==1.4.0and more recentpendulum==2.1.2

import pendulum
from datetime import datetime

p = pendulum.now()
datetime_string = p.to_datetime_string()
datetime.fromisoformat(datetime_string)

这会给

datetime.datetime(2021, 5, 24, 12, 44, 11)
于 2021-05-24T16:46:53.777 回答
0

以下代码适用于我:

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)))
于 2022-02-22T06:32:31.897 回答
-6

使用箭头模块 将钟摆转换为日期时间

>>> 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')]
于 2020-04-04T23:11:05.413 回答