2017-07-21 1 views
1

Ich habe eine sehr ähnliche Frage an diese: Pandas graphing a timeseries, with vertical lines at selected dates, aber die Lösung funktioniert nicht mit Timedelta.Pandas, die eine Timedelta-Serie zeichnen, mit vertikalen Linien zur ausgewählten Zeit

Betrachten Sie diese Serie:

In: 
avg_hr.head() 

Out: 
00:00:00  69.000000 
00:00:01  93.750000 
00:00:02  93.125000 
00:00:03  92.900000 
00:00:04  93.222222 
00:00:05  93.222222 
... 
Name: bpm, Length: 253, dtype: float64 

I-Element in dieser Reihe wie folgt wählen:

In: 
avg_hr[pd.Timedelta(seconds=3)] 

Out: 
92.9 

ich eine Grafik wie folgt erzeugen:

In: 
avg_hr.plot() 

avg_hr.plot()

Aber ich kann nicht vertikale Linien mit Timedelta wie dieses Grundstück:

In: 
plt.axvline(x=pd.Timedelta(seconds=110), color='r', linestyle='dashed', linewidth=2) 

Out: 
TypeError: Cannot compare type 'Timedelta' with type 'float64' 

Obwohl, wenn ich einen Schwimmer oder int verwenden, werden die vertikalen Linien an der Position 0.

In: 
plt.axvline(x=110, color='r', linestyle='dashed', linewidth=2) 

avg_hr.plot()

Wie kann ich vertikale Linien mit diesem Timedelta-Index plotten?

EDIT:

Auch wenn ich direkt mit den Tasten auf der x-Achse verwendet wird, ich die gleiche Fehlermeldung anzeigt:

In: 
for key in avg_hr.keys(): 
    ax.axvline(x=key, color='r', linestyle='dashed', linewidth=2) 

Out: 
TypeError: Cannot compare type 'Timedelta' with type 'float64' 
+1

Was 'avg_hr.index.dtype' kehrt tut? –

+1

@ Vinícius Aguiar: Out: timedelta64 [ns] – probitaille

Antwort

4

Ich fand heraus, dass, selbst wenn ich in Sekunden arbeiten, und dass die Achsenbeschriftung die Zeit in Sekunden anzeigt, ist es tatsächlich in Nanosekunden!

Aus der Dokumentation Pandas Time Deltas:

Pandas represents Timedeltas in nanosecond resolution using 64 bit integers

im Beispiel meiner Frage also, wenn ich das genannt, war die vertikale Linie auf nicht Stellung 0, aber an Position 110 ns in der Tat (so ganz in der Nähe 0 mit dieser Skala):

plt.axvline(x=110, color='r', linestyle='dashed', linewidth=2) 

Die Lösung einfach Ihren x-Wert in Nanosekunden zu konvertieren ist:

x_ns = pd.Timedelta(seconds=110)/pd.Timedelta(1,'ns') #Seconds to nanoseconds 
plt.axvline(x=x_ns, color='r', linestyle='dashed', linewidth=2) 

Ich fand dies, als ich versuchte, das Xlim zu ändern, dann sah ich, dass alles in Nanosekunden skaliert wurde. Also musste die gleiche Konvertierung auf xlim angewendet werden.

ax1.set_xlim([0, 110]) 

enter image description here

Das Ergebnis mit mehreren vertikalen Linien

enter image description here

Geschehen mit:

#Add verticals lines for specific event 
plt.axvline(x=pd.Timedelta(seconds=120)/pd.Timedelta(1,'ns'), color='r', linestyle='dashed', linewidth=2) 
plt.axvline(x=pd.Timedelta(seconds=185)/pd.Timedelta(1, 'ns'), color='r', linestyle='dashed', linewidth=2) 
plt.axvline(x=pd.Timedelta(seconds=210)/pd.Timedelta(1, 'ns'), color='r', linestyle='dashed', linewidth=2) 
plt.axvline(x=pd.Timedelta(seconds=225)/pd.Timedelta(1, 'ns'), color='r', linestyle='dashed', linewidth=2) 
+1

Wirklich ordentlich, Sie könnten stattdessen Ihren Datenrahmen umformatieren, es scheint, dass 'avg_hr = pd.DataFrame ({'data': pd.Series (np.random.randn (240)) .cumsum(), 'time': pd.to_timedelta (np.arange (240), unit = 's')}) '; 'avg_hr.plot()'; 'plt.axvline (x = 110, color = 'r', linestyle = 'gestrichelt', linienbreite = 2)'; 'plt.show()' funktioniert gut. –

Verwandte Themen