pandas between_time():两个其他日期时间序列之间的日期时间序列

时间:2017-03-28 06:22:30

标签: python pandas

如果我有一个开始和结束时间的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或类似的东西来做到这一点,但我无法弄清楚如何。

2 个答案:

答案 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]
相关问题