2017-06-30 2 views
0

Ich habe eine Reihe von stündlichen Daten und eine Python-Liste von Daten, die ich bei der Prüfung interessiert bin:Wie kann ich alle Einträge in einer DateTimeIndexed-Pandas-Serie erhalten, die in einer Liste von Tagen vorkommen?

>>> hourly 
KWH_DTTM 
2015-06-20 15:00:00 2138.4 
2015-06-20 16:00:00 4284.0 
2015-06-20 17:00:00 4168.8 
        ... 
2017-06-21 21:00:00 2743.2 
2017-06-21 22:00:00 2757.6 
2017-06-21 23:00:00 2635.2 
Freq: H, Name: KWH, Length: 17577, dtype: float64 

>>> days 
[datetime.date(2017, 5, 5), datetime.date(2017, 5, 8), datetime.date(2017, 5, 9), datetime.date(2017, 6, 2)] 

Ich versuche, herauszufinden, wie man alle Einträge aus hourly, die an einem Tag landen wählen, in days (Tage sind ungefähr 50 Einträge lang, und Daten können beliebig sein). days ist derzeit eine Liste von date Objekte Python, aber ich mich nicht, wenn sie Strings sind, usw.

Wenn ich Index hourly mit days, erhalte ich eine Serie, die täglichen Intervallen neu abgetastet wurde:

>>> hourly[days] 
KWH_DTTM 
2017-05-05 2628.0 
2017-05-08 2628.0 
2017-05-09 2548.8 
2017-06-02 2512.8 
Name: KWH, Length: 30, dtype: float64 

Wenn mit einem einzigen Tag I-Index, in einen String gemacht, bekomme ich die gewünschte Ausgabe für diesen Tag:

>>> hourly['2017-5-5'] 
KWH_DTTM 
2017-05-05 00:00:00 2505.6 
2017-05-05 01:00:00 2563.2 
2017-05-05 02:00:00 2505.6 
        ... 
2017-05-05 21:00:00 2268.0 
2017-05-05 22:00:00 2232.0 
2017-05-05 23:00:00 2088.0 
Freq: H, Name: KWH, Length: 24, dtype: float64 

gibt es eine Möglichkeit, dies zu tun außer über die Liste meiner Tage Looping und die verketten r ergebnisse?

Antwort

1

Betrachten Sie eine boolean Serie von einem Series.apply() errichtetes Gebäude jeder vorbei datetimeindex Wert und prüfen, ob es gleich jedem Element von Daten über ein Listenverständnis ist. Verwenden Sie dann diese boolesche Reihe, um stündlich Serien zu filtern.

# DATA EXAMPLE 
np.random.seed(45) 
hourly = pd.Series(index=pd.DatetimeIndex(start='2016-09-05 00:00:00', 
              periods=17577, freq='H'), 
        data=np.random.randn(17577), 
        name='KWH_DTTM') 

days = [datetime.date(2017, 5, 5), datetime.date(2017, 5, 8), 
     datetime.date(2017, 5, 9), datetime.date(2017, 6, 2)] 

# BOOLEAN SERIES 
bools = pd.Series(hourly.index.values).apply(lambda x: \ 
             max([x.date() == d for d in days])) 
bools.index = hourly.index 

# FILTER ORIGINAL SERIES 
newhourly = hourly[bools] 

print(newhourly.head(10)) 
# 2017-05-05 00:00:00 -0.238799 
# 2017-05-05 01:00:00 -0.263365 
# 2017-05-05 02:00:00 -0.249632 
# 2017-05-05 03:00:00 0.131630 
# 2017-05-05 04:00:00 -1.279383 
# 2017-05-05 05:00:00 0.411316 
# 2017-05-05 06:00:00 -2.059022 
# 2017-05-05 07:00:00 -1.008058 
# 2017-05-05 08:00:00 -0.365651 
# 2017-05-05 09:00:00 1.515522 
# Name: KWH_DTTM, dtype: float64 

print(newhourly.tail(10)) 
# 2017-06-02 14:00:00 0.329567 
# 2017-06-02 15:00:00 -0.618604 
# 2017-06-02 16:00:00 0.848719 
# 2017-06-02 17:00:00 -1.152657 
# 2017-06-02 18:00:00 0.269618 
# 2017-06-02 19:00:00 -1.806861 
# 2017-06-02 20:00:00 -0.188643 
# 2017-06-02 21:00:00 0.515790 
# 2017-06-02 22:00:00 0.384695 
# 2017-06-02 23:00:00 1.115494 
# Name: KWH_DTTM, dtype: float64 
1

Sie könnten hourly zu einem Datenrahmen konvertieren, und verwenden Sie dann .isin():

df = hourly.reset_index(name='KWH').rename(columns={'index':'hours'}) 
df = df[df.hours.apply(lambda x: datetime.date(x.year, x.month, x.day)).isin(dates)] 

Hier ist der vollständige Code mit Zufallsdaten:

import pandas as pd 
import datetime 
import random 

random_data = [random.randint(1000,2000) for x in range(1,1000)] 
hours = [datetime.datetime(random.randint(2014,2016),random.randint(1,12),random.randint(1,28),random.randint(1,23),0) for x in range(1,1000)] 

hourly = pd.Series(data=random_data, index=h) 

dates = [datetime.date(random.randint(2014,2016),random.randint(1,12),random.randint(1,28)) for x in range(1,10)] 

df = hourly.reset_index(name='KWH').rename(columns={'index':'hours'}) 
df = df[df.hours.apply(lambda x: datetime.date(x.year, x.month, x.day)).isin(dates)] 
Verwandte Themen