2017-03-28 2 views
2

Wenn ich ein Datenrahmen von Start- und Endzeiten wie:Pandas between_time(): Datetime-Serie zwischen zwei anderen Datetime-Serie

2015-11-21 16:00:00 2015-11-22 00:30:00 
2015-05-16 12:15:00 2015-05-16 22:03:00 
2015-10-15 16:00:00 2015-10-15 23:30:00 

Und dann eine Reihe von Zeitstempel wie folgt aus:

2015-11-21 18:42:13 
2015-11-21 00:32:00 
2015-05-16 12:37:00 

und ich möchte in der Lage sein, zu filtern, dass nur Serie der Zeiten innerhalb der oben genannten Zeiten zu erhalten, so in diesem Fall:

2015-11-21 18:42:13 
2015-05-16 12:37:00 

series[series.between_time(df.start, df.end)], wird nicht funktionieren, weil es Skalarzeiten benötigt; series[df.start < series < df.end] aber das gibt mir einen ValueError weil die Serien nicht identisch beschriftet sind.

Ich habe das Gefühl, dass es einen Weg geben muss, dies mit einem Timedelta oder etwas Ähnlichem zu tun, aber ich kann nicht herausfinden, wie.

Antwort

2

können Sie zuerst verwenden Kreuz verbinden und dann filtern, indem query:

print (df) 
       start     end 
0 2015-11-21 16:00:00 2015-11-22 00:30:00 
1 2015-05-16 12:15:00 2015-05-16 22:03:00 
2 2015-10-15 16:00:00 2015-10-15 23:30:00 

print (series) 
0 2015-11-21 18:42:13 
1 2015-11-21 00:32:00 
2 2015-05-16 12:37:00 <-changed date 
Name: date, dtype: datetime64[ns] 

df = pd.merge(df.assign(A=1), series.to_frame().assign(A=1), on='A') 
df = df.query('start < date < end')['date'] 
print (df) 
0 2015-11-21 18:42:13 
5 2015-05-16 12:37:00 
Name: date, dtype: datetime64[ns] 
1

Ihre Datenrahmen Unter der Annahme df und Serie ist series
Wir searchsorted verwenden können, um zu sehen, ob die sortierten Ort jeder Wert in series Ländern in der gleichen Reihe.

df.sort_values('start', inplace=True) 

series.loc[ 
    df.iloc[:, 0].searchsorted(series) - 1 == df.iloc[:, 1].searchsorted(series) 
] 

0 2015-11-21 18:42:13 
2 2015-05-16 12:37:00 
dtype: datetime64[ns] 

Wir können numpy fy dies mit

v = df.sort_values('start').values 
s = series.values 

series.loc[v[:, 0].searchsorted(s) - 1 == v[:, 1].searchsorted(s)] 

0 2015-11-21 18:42:13 
2 2015-05-16 12:37:00 
dtype: datetime64[ns] 
+0

'searchsorted' findet Lage vor einzufügen. Wenn also Datum> Start ist, ist der Index, den es einfügt, Index + 1. – piRSquared

Verwandte Themen