7
votes

Comment convertir le pendule en type datetime.datetime?

Dans la partie actuelle du système, le pendule v1.4 est utilisé, mais avec croniter cela provoque une erreur décrite dans https://github.com/sdispater/pendulum/issues/214

Cela fonctionne bien avec le type datetime.datetime et je dois toujours rester avec le pendule v1.4.

Je cherche donc une solution pour convertir efficacement le pendule en type datetime.datetime?

J'ai déjà essayé de formater le pendule sous forme de chaîne et d'analyser avec dateutil.parser.


0 commentaires

3 Réponses :


2
votes

Je n'ai pas non plus trouvé d'aide Pendulum pour cela. Donc, revenons à l'essentiel:

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)

Notez l'utilisation de dateutil. Depuis Python 3.6, la documentation tzinfo recommande dateutil.tz plutôt que pytz comme fournisseur de fuseau horaire IANA.


0 commentaires

9
votes

Autre point de vue sur ceci:

>>> from datetime import datetime
>>> import pendulum
>>> datetime.fromtimestamp(pendulum.now().timestamp())
datetime.datetime(2019, 3, 20, 16, 32, 24, 172283)

Mais, en fait, il n'est pas nécessaire: le DateTime de pendule hérite de datetime.datetime , donc tout code fonctionnant avec les datetime de stdlib devrait également fonctionner.


7 commentaires

Je ne suis pas sûr des pandas


@MisterMonk Pour les pandas, les nanosecondes du pendule doivent être supprimées, Pandas ne supporte pas les nanosecondes. pandas_friendly = pendulum_datetime.strftime ("% Y-% m-% d% H:% M:% S% z") Voir ici: gist.github.com/liquidgenius/195fd7ca99fb761fd0fd2c2f2c78608‌ d et ici: github.com/sdispater/pendulum/issues/246


Juste pour ajouter au compteur des exemples de DateTime du pendule fonctionnant partout où datetime le fait - SQLAlchemy n'aime pas utiliser le DateTime du pendule et peut causer des problèmes étranges.


@robertlayton Si vous essayez d'utiliser la DateTime du pendule comme type de colonne, comme ceci: Column ('foo', pendulum.DateTime) - ce n'est pas prévu pour travail.


Merci pour la réponse. J'utilise une colonne datetime SQLAlchemy normale, mais lorsque vous lui passez un pendule DateTime, elle échoue au moment de la validation de la base de données. Je vais maintenant l'envelopper dans une fonction pendulum_to_datetime avant de passer.


@robertlayton Voici l'essentiel qui montre l'utilisation des instances DateTime du pendule en tant que valeurs pour les colonnes SQLA DateTime : gist.github.com/tribals/... . Comme vous pouvez le voir, cela fonctionne bien.


@tosh. Impressionnant. Merci pour le suivi. Je vois que la version de SQLAlchemy est supérieure à celle de mon projet, je vais donc essayer de la mettre à jour et voir comment cela se passe.



-4
votes

utilisez le module flèche pour convertir le pendule en datetime

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')]

exemple:

>>> arrow.get(datetime(2013, 5, 5), 'US/Pacific')
<Arrow [2013-05-05T00:00:00-07:00]>


0 commentaires