Je rencontre des difficultés à travailler avec les heures/les fuseaux horaires. J'ai des données JSON brutes de la forme
{
"Date": "28 Sep 2009 00:00:00",
....
}
Ces données sont ensuite chargées dans MongoDB, et cette représentation de chaîne de la date est transformée en un objet Date JavaScript. Cette conversion en temps de UTC résulte en la date suivante
{
"_id": ObjectId("577a788f4439e17afd4e21f7"),
"Date": ISODate("2009-09-27T23:00:00Z")
}
Il "semble" que la date ait en fait été déplacée d'un jour en avant, je suppose (peut-être à tort) que c'est parce que mon ordinateur est réglé sur le fuseau horaire irlandais.
J'ai ensuite lu ces données depuis MongoDB et je les ai utilisées pour créer un DatetimeIndex pandas
idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')
ce qui me donne
ce qui est incorrect car l'heure n'a pas été convertie correctement de l'UTC au temps local. J'ai donc suivi la solution donnée dans cette réponse
idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')
idx = idx.tz_localize(tz=tz.tzutc())
idx = idx.tz_convert(tz=tz.tzlocal())
frame = DataFrame(test_docs, index=idx)
frame = frame.drop('Date', 1)
ce qui me donne le bon jour en retour
Je normalise ensuite le DatetimeIndex pour supprimer les heures, me permettant de regrouper toutes les entrées par jour.
frame.groupby(idx).sum()
Cependant, à ce stade, quelque chose d'étrange se produit. Les dates se retrouvent regroupées de la manière suivante
mais cela ne reflète pas les dates dans le cadre
Quelqu'un peut-il m'éclairer sur où je pourrais me tromper?
Réponse à @ptrj
Utilisation explicite de mon fuseau horaire en tant que chaîne
idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')
idx = idx.tz_localize(tz=tz.tzutc())
idx = idx.tz_convert(tz='Europe/Dublin')
idx = idx.normalize()
frame = DataFrame(test_docs, index=idx)
...
...
aggregate = frame.groupby(idx).sum()
aggregate.plot()
cela ne fonctionne pas pour moi, cela donne le graphique suivant
Pour une raison quelconque, le groupby ne regroupe pas correctement pour 2014, comme indiqué ci-dessous
Si à la place, j'utilise
idx = idx.tz_convert(tz.gettz('Europe/Dublin'))
J'ai le même problème
Convertir en un objet
idx = pd.DatetimeIndex([x['Date'] for x in test_docs], freq='D')
idx = idx.tz_localize(tz=tz.tzutc())
idx = idx.tz_convert(tz=tz.tzlocal())
idx = idx.normalize()
frame = DataFrame(test_docs, index=idx)
aggregate = frame.groupby(idx.astype(object)).sum()
Cette approche semble fonctionner correctement pour moi