2017-11-23 4 views
0

Ich habe eine Zeichenfolge, die eine UTC Datetime enthältDatetime-Modul und Pandas to_datetime unterschiedliche Ergebnisse

utc_str = '2017-11-21T23:00+0100' 

, die in meiner Ortszeit (Europe/Berlin) ist:

local_time = '2017-11-22 00:00' 

Und ist der gewünschte Wert Ich möchte von utc_string erhalten.

kann ich utc_string-local_time konvertieren ganz gut mit:

import datetime as dt 
utc_time = dt.datetime.strptime(date_str, '%Y-%m-%dT%H:%M%z') 
local_time = utc_time.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin')) 

print(local_time.strftime('%Y-%m-%d %H:%M')) 
>>> 2017-11-22 00:00 

Allerdings, wenn ich Pandas verwenden, erhalte ich ein anderes Ergebnis. Es scheint nicht die UTC anzuwenden Offset:

import pandas as pd 
pd_date = pd.to_datetime(date_str, utc=True) 

print(pd_date.strftime('%Y-%m-%d %H:%M')) 
>>> '2017-11-21 22:00' 

Und naiv, wenn ich versuche, wie mit dem datetime Modul den gleichen Prozess zu tun, die Ergebnisse sind immer noch aus:

pd_date = pd.to_datetime(date_str, utc=True) 
pd_date = pd_date.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin')) 

print(pd_date.strftime('%Y-%m-%d %H:%M')) 
>>> '2017-11-21 23:00' 

Gibt es etwas, was ich nicht verstehe? Benutze ich pd.to_datetime oder etwas anderes falsch? Auf Python 3.6, Windows 7.

+0

nicht ''2017-11-21T23: 00 + 0100'' spezifiziere Zeitzone' + 0100' (Europa/Berlin) statt UTC?Das ist '22: 00' in UTC –

+0

Also wenn ich richtig verstehe, ist die Zeichenfolge entweder falsch oder das utc-Format falsch angegeben? In welcher Form ist es dann? Es ist in den Daten, die ich habe, also muss ich wissen, wie man damit umgeht. –

+0

Ihre Verwendung von 'replace' zur Berechnung der Ortszeit ist falsch. Sie können einfach 'astimezone (...)' –

Antwort

1

Wie im Kommentar erwähnt, glaube ich, den Code für local_time falsch ist

utc_time 
datetime.datetime(2017, 11, 21, 23, 0, tzinfo=datetime.timezone(datetime.timedelta(0, 3600)) 
utc_time.replace(tzinfo=pytz.utc) 
'datetime.datetime(2017, 11, 21, 23, 0, tzinfo=<UTC>)' 

so dies replace entfernt die '+0100 vom datetime, aber hält den Rest des gleichen

utc_time.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin')) 
"datetime.datetime(2017, 11, 22, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)" 

Dies fügt dann 1 Stunde bis 23: 00UTC, so wird die Mitternacht am nächsten Tag in Berlin als

erwartet
pd.to_datetime(utc_str, utc=True) 
Timestamp('2017-11-21 22:00:00+0000', tz='UTC') 

Der Unterschied im Verhalten ist auf den Konstruktor zurückzuführen. pd.to_datetime berechnet die Zeit und Zeitzone zurück bis 22: 00UTC statt 23: 00 + 0100, also, wenn es die Zeitzone Info mit UTC ersetzen, es ändert sich nichts

Ortszeit

Ihr utc_time Objekt in der richtigen ist timezone, also wenn du die lokale Zeit willst, kannst du einfach utc_time.strftime('%Y-%m-%d %H:%M') in Pandas machen pd.to_datetime(utc_str, utc=True).astimezone(pytz.timezone('Europe/Berlin')).strftime('%Y-%m-%d %H:%M')

+0

Ich verstehe. Es scheint, dass die "utc_time" in zwei verschiedenen Formen vorliegt: die tatsächliche UTC '2017-11-21 23: 00' und dann der lokale Offset' + 0100', die, wenn sie zusammen addiert werden, die lokale Zeitangabe 2017-11 erhalten -22 00: 00'. Ich denke, diese Zeichenfolge sollte wahrscheinlich nur den Offset entfernen und dann als eine Zeitangabe hinzufügen, weil "utc_time" in einer nicht-sinnlichen Form zu sein scheint. –

+0

Ich meine 'utc_str' statt' utc_time' –

+0

Die 'utc_string' ist keine Zeichenfolge einer UTC-Zeit, sondern eine lokale Zeitdarstellung. –

Verwandte Themen