如果我有一个开始和结束时间的DataFrame,如:
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
然后是一系列这样的时间戳:
2015-11-21 18:42:13
2015-11-21 00:32:00
2015-05-16 12:37:00
我希望能够过滤该系列只获得上述时间内的时间,所以在这种情况下:
2015-11-21 18:42:13
2015-05-16 12:37:00
series[series.between_time(df.start, df.end)]
,因为需要标量时间而无效; series[df.start < series < df.end]
但是这给了我一个ValueError,因为系列没有相同的标签。
我觉得必须有一种方法可以用Timedelta或类似的东西来做到这一点,但我无法弄清楚如何。
答案 0 :(得分:3)
您可以使用第一个交叉联接,然后按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 :(得分:1)
假设您的数据框为df
且系列为series
我们可以使用searchsorted
查看series
中每个值的排序位置是否位于同一行。
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]
我们可以numpy
使用
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]