2017-03-28 59 views
2

如果我有这样的开始和结束时间一个数据帧:大熊猫between_time():与其他两个日期时间系列的datetime系列

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或类似的东西,但我不知道如何。

回答

2

可以使用第一交叉连接,然后通过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

假设你的数据帧是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] 
+0

'searchsorted'找到位置之前插入。所以如果date> start,它插入的索引是index + 1。 – piRSquared