J'ai ce que je pensais être un problème simple mais cela devient de plus en plus déroutant à mesure que je lis plus et que je parcours les questions sur ce forum. Je m'excuse si cela a été demandé plus tôt, mais jusqu'à présent, je n'ai trouvé aucune source qui traite les deux étapes mentionnées ci-dessous ensemble.

Problème : j'ai une trame de données avec une heure comme celle-ci (sans mentionner le fuseau horaire ou le décalage)

Date Time 
2020-01-02 22:00:00
2020-01-03 01:00:00 
2002-01-03 01:05:00  

Etc. Ces heures sont en EST. EST suit l'heure d'été

Je dois convertir cela en heure standard du Japon qui ne suit pas l'heure d'été

Donc, d'abord, je dois convertir l'heure 2020-01-02 22:00:00 en objet datetime EST. j'allais utiliser datetime.strptime mais je ne sais pas où mettre le fuseau horaire.

Ensuite, je dois convertir l'objet datetime EST en heure standard du Japon. Mais je ne sais pas si python déterminera automatiquement quand l'heure d'été a commencé dans le fuseau horaire américain EST. Il y a eu quelques changements par le congrès américain dans le passé et donc, comment Python le saura-t-il. De même, si à l'avenir il y a des changements par le Congrès américain, par ex. ils suppriment l'heure d'été, pourrons-nous conserver le même code en mettant simplement à jour les routines python pour le fuseau horaire.

Merci pour toutes les entrées

0
Ramana 6 févr. 2020 à 12:11

1 réponse

Meilleure réponse

En supposant que la valeur de votre dataframe est naïve de fuseau horaire, alias datetime sans fuseau horaire, vous devez alors attacher le fuseau horaire EST avec l'heure d'été avec tz_localize('EST', ambiguous='infer'), puis utiliser tz_convert('Asia/Tokyo') pour modifier l'heure correcte pour le Japon.

Sans informations spécifiques sur la ville pour laquelle ces données sont destinées, il peut être impossible de déterminer si l'heure d'été est en vigueur. Selon https://www.timeanddate.com/time/zone/usa/ new-york, NY est EST jusqu'au 2020-05-07, puis sera à EDT UTC-04:00 jusqu'au 31 oct.

Voir https://pandas .pydata.org/docs/reference/api/pandas.DatetimeIndex.tz_localize.html#pandas-datetimeindex-tz-localize pour plus d'informations sur l'heure d'été

Dans certains cas, il est impossible de déduire l'heure d'été. Dans de tels cas, vous pouvez passer un ndarray au paramètre ambigu pour définir explicitement l'heure d'été

...

s.dt.tz_localize('CET', ambiguous=np.array([True, True, False]))

Je commence avec des valeurs de chaîne

# just str, not a datetime index
>>> df.info()                                                                                                                                                            
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 1 columns):
Datetime    3 non-null object
dtypes: object(1)
memory usage: 152.0+ bytes

# convert to datetime
>>> tz_naive = pd.to_datetime(df['Datetime'])
>>> tz_naive
0   2020-01-02 22:00:00
1   2020-01-03 01:00:00
2   2002-01-03 01:05:00
Name: Datetime, dtype: datetime64[ns]

>>> tz_aware = tz_naive.dt.tz_localize('EST', ambiguous='infer')
>>> tz_aware                                                                                                                                                              
0   2020-01-02 22:00:00-05:00
1   2020-01-03 01:00:00-05:00
2   2002-01-03 01:05:00-05:00
Name: Datetime, dtype: datetime64[ns, EST]

>>> tz_aware.dt.tz_convert('Asia/Tokyo')
0   2020-01-03 12:00:00+09:00
1   2020-01-03 15:00:00+09:00
2   2002-01-03 15:05:00+09:00
Name: Datetime, dtype: datetime64[ns, Asia/Tokyo]
1
Community 20 juin 2020 à 09:12