2016-03-30 8 views
0

Ich habe diese Zeitreihe (raw_series):Wie kann ich die Summe einer Teilmenge in einer Pandas-Zeitreihe korrekt berechnen?

2016-03-30 00:01:00 2 
2016-03-30 04:54:00 4 
2016-03-30 08:51:00 1 
2016-03-30 08:54:00 0 
2016-03-30 08:55:00 1 
2016-03-30 08:56:00 1 
2016-03-30 08:57:00 2 
2016-03-30 08:58:00 0 
2016-03-30 09:00:00 1 
2016-03-30 09:01:00 0 
2016-03-30 09:04:00 0 
2016-03-30 09:05:00 7 
2016-03-30 09:06:00 4 
2016-03-30 09:22:00 0 
2016-03-30 09:24:00 8 
2016-03-30 09:25:00 3 
2016-03-30 09:28:00 0 
2016-03-30 09:29:00 0 
2016-03-30 09:39:00 1 
2016-03-30 09:40:00 1 
2016-03-30 09:41:00 1 

Ich möchte die Summe der Werte um 09:00 Uhr und um 08:00 Uhr zu berechnen. Das ist, was ich tun (aber wird nicht funktionieren)

now = datetime.now() 
try: 
    this_hour = raw_series[datetime(now.year, now.month, now.day, now.hour)].sum() 
except KeyError: 
    this_hour = 0 

prev = now - timedelta(hours=1) 
try: 
    prev_hour = raw_series[datetime(prev.year, prev.month, prev.day, prev.hour)].sum() 
except KeyError: 
    prev_hour = 0 

Die Zeit war ich das Programm laufen now wurde (von der Debug-Ausgabedatei kopiert):

[30/Mar/2016 09:59:45] DEBUG [main.views:267] now is 2016-03-30 09:59:41.318779 

Die Boerse sind: this_hour = 1.0 und prev_hour = 0 (Ausnahme)

Was mache ich falsch?

Antwort

1

IIUC Sie Ihren Index datetime.index mit pd.to_datetime umwandeln konnte und dann Maske stundenlang verwenden:

s = pd.Series([2, 4, 1, 0, 1, 1, 2, 0, 1, 0, 0, 7, 4, 0, 8, 3, 0, 0, 1, 1, 1], index=['2016-03-30 00:01:00', '2016-03-30 04:54:00', '2016-03-30 08:51:00', '2016-03-30 08:54:00', '2016-03-30 08:55:00', '2016-03-30 08:56:00', '2016-03-30 08:57:00', '2016-03-30 08:58:00', '2016-03-30 09:00:00', '2016-03-30 09:01:00', '2016-03-30 09:04:00', '2016-03-30 09:05:00', '2016-03-30 09:06:00', '2016-03-30 09:22:00', '2016-03-30 09:24:00', '2016-03-30 09:25:00', '2016-03-30 09:28:00', '2016-03-30 09:29:00', '2016-03-30 09:39:00', '2016-03-30 09:40:00', '2016-03-30 09:41:00']) 

s.index = pd.to_datetime(s.index) 
cur_hour = 9 
prev_hour = cur_hour - 1 
res1 = s[s.index.hour == cur_hour].sum() 
res2 = s[s.index.hour == prev_hour].sum() 

In [57]: res1 
Out[57]: 26 

In [58]: res2 
Out[58]: 5 
+0

Dank. Es klappt. Allerdings verstehe ich immer noch nicht, warum mein Ansatz nicht das erwartete Ergebnis liefert. – xpanta

+1

Weil für datetime Slicing Ergebnisse erhalten werden, wenn Ihre Minuten Null sind, für den ersten Fall wird es '2016-03-30 09: 00: 00' für das zweite Nichts sein. Das könntest du mit 'now = datetime (Jahr = 2016, Monat = 3, Tag = 30, Stunde = 9) überprüfen; s [jetzt: jetzt] ' –

Verwandte Themen