2017-10-11 2 views
0

Wie setze ich pyplot richtig, um Daten in einer bestimmten Zeitzone darzustellen? Ich kann verschiedene Orte sehen, um ein TZInfo-Objekt zu setzen, aber alle diese tun entweder nichts oder funktionieren nicht wie erwartet. Ich lade eine Liste der Datensätze aus einer CSV, mit jeder Datensatz ist [naive Zeitstempel in UTC, die Zahl plotten]Plotten von Daten mit Zeitzonen in matplotlib.pyplot

import pytz 
from datetime import datetime 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
estZone=pytz.timezone('US/Eastern') 

records=[['10/10/17 12:00','100'],['11/10/17 12:00','150'],['12/10/17 12:00','200']] 

def parseDT(stampString): 
    return datetime.strptime(stampString,'%d/%m/%y %H:%M') 

def plotGraph(): 
    xvalues=[] 
    yvalues=[] 
    for r in records: 
     rdatetime=(parseDT(r[0])) #parseDT just returns naive DT 
     rdatetime=pytz.utc.localize(rdatetime) 
     rdatetime=rdatetime.astimezone(tz=estZone) 
     xvalues.append(rdatetime) 
     yvalues.append(int(r[1])) 

    fig,ax=plt.subplots(figsize=(8,3)) 
    plt.plot_date(xvalues,yvalues,ls='solid',lw=1.5,aa=True,marker='None',color='g') 
    dayFmt=mdates.DateFormatter('%a-%b-%d') 
    hrFmt=mdates.DateFormatter('%H:00') 
    ax.xaxis.set_major_formatter(dayFmt) 
    ax.xaxis.set_major_locator(mdates.DayLocator()) 
    ax.xaxis.set_minor_locator(mdates.HourLocator(byhour=[6,12,18])) 
    ax.xaxis.set_minor_formatter(hrFmt) 
    plt.grid(b=True, which='both',linestyle='dotted') 
    plt.show() 

plotGraph() 

Dies erzeugt (minus einige Formatierung) diese Zahl:

First output die eigentlich noch UTC. Es ist identisch mit dem Ergebnis, wenn ich die astimezone(tz=estZone) weggelassen hätte, obwohl ich überprüft habe, dass das Teil definitiv funktioniert.

Wenn ich fortfahren, tz=estZone zu plt.plot_date zu übergeben, ist die Abbildung identisch. Es gibt keine Veränderung. Wie kann ich dies ändern, um einen EST-Graphen aus meinen UTC-Zeitstempeln zu erstellen?

+0

Sie möchten ein [mcve] des Problems bereitstellen. – ImportanceOfBeingErnest

+0

Sorry, ich weiß nicht, was ich hinzufügen soll, um es klarer zu machen. Der Codeblock enthält alles Relevante und nichts als. Es zeichnet UTC auf. Ich möchte es mal in EST plotten lassen. Enthalten sind Beispiele für Dinge, die nicht funktionieren. – user3896248

+0

Die Hauptmaschine, die jede Art von Debugging ansteuert, ist die Reproduzierbarkeit. Jetzt kann ich das obige Problem nicht reproduzieren, weil kein [mcve] gegeben ist. I.e. Ich kann den Code nicht kopieren und ausführen, um das Problem zu sehen. Daher kann ich bestimmte Dinge nicht testen, um das Problem zu lokalisieren und somit kann ich dir nicht helfen. Natürlich kannst du Glück haben und den einen Typen finden, der das Paket geschrieben hat, um zu wissen, was von oben los ist, oder du findest jemanden, der zu viel Zeit hat, um selbst ein solches Beispiel zu schreiben. Meistens aber werden Fragen ohne [mcve] einfach als off-topic geschlossen oder werden nie beantwortet. Deine Entscheidung. – ImportanceOfBeingErnest

Antwort

0

Ich hatte versucht, die Zeitzone an die DateFormatters für die X-Achsenbeschriftungen zuvor zu übergeben, aber der Zeitzonenmodifikator scheint nach dem Platzieren der Locators angewendet zu werden. Alle Etiketten lesen 4 Stunden hinter jeder Mitternacht oder den angegebenen Stunden. Ich habe festgestellt, dass die Lokatoren auch die Zeitzone als Parameter brauchen, um dem entgegenzuwirken. Das würde es tun.