Pandas删除时间范围外的行

18 投票
3 回答
21659 浏览
提问于 2025-04-17 13:45

我正在尝试遍历一个数据表中的每一行,并删除所有不在特定时间范围内的行。

我一直在寻找解决办法,但没有一个方法是把日期和时间分开的。我只想删除那些不在时间范围内的行。

3 个回答

0

如果你不需要一个原地操作的函数,那么就可以使用 between_time,正如 @AndyHayden 所说的那样。

对于那些想要原地操作的人,我在这里留个评论:如果你想直接在 pandas.DataFrame df 上进行选择,可以使用:

df.drop(numpy.setdiff1d(df.index, df.between_time(start_time=dt.time(hours=8,minute=0),
                                               end_time=dt.time(hours=18, minute=0),
                                               include_start=True, 
                                               include_end=False).index)
       ,inplace=True)

这里的 dt 是指日期时间。

我们会找到那些不在时间范围内的索引,并直接把它们删除。

4

你也可以这样做:

rng = pd.date_range('1/1/2000', periods=24, freq='H')
ts = pd.Series(pd.np.random.randn(len(rng)), index=rng)
ts.ix[datetime.time(10):datetime.time(14)]
Out[4]: 
2000-01-01 10:00:00   -0.363420
2000-01-01 11:00:00   -0.979251
2000-01-01 12:00:00   -0.896648
2000-01-01 13:00:00   -0.051159
2000-01-01 14:00:00   -0.449192
Freq: H, dtype: float64

DataFrame 的工作方式也是一样的。

22

你可以直接使用 between_time 这个函数:

ts.between_time(datetime.time(18), datetime.time(9), include_start=False, include_end=False)

原始回答:

你可以使用 indexer_between_time 这个 Index 方法。

比如说,要包含早上9点到晚上6点之间的时间(包括这两个时间):

ts.ix[ts.index.indexer_between_time(datetime.time(9), datetime.time(18))]

如果你想做相反的事情,也就是排除晚上6点到早上9点之间的时间(不包括这两个时间):

ts.ix[ts.index.indexer_between_time(datetime.time(18), datetime.time(9),
                                    include_start=False, include_end=False)]

注意:indexer_between_time 的参数 include_startinclude_end 默认都是 True,如果把 include_start 设置为 False,那么时间正好是 start_time(第一个参数),在这个例子中就是晚上6点的时间将不会被包含。

示例:

In [1]: rng = pd.date_range('1/1/2000', periods=24, freq='H')

In [2]: ts = pd.Series(pd.np.random.randn(len(rng)), index=rng)

In [3]: ts.ix[ts.index.indexer_between_time(datetime.time(10), datetime.time(14))] 
Out[3]: 
2000-01-01 10:00:00    1.312561
2000-01-01 11:00:00   -1.308502
2000-01-01 12:00:00   -0.515339
2000-01-01 13:00:00    1.536540
2000-01-01 14:00:00    0.108617

注意:同样的语法(使用 ix)也适用于 DataFrame:

In [4]: df = pd.DataFrame(ts)

In [5]: df.ix[df.index.indexer_between_time(datetime.time(10), datetime.time(14))]
Out[5]: 
                            0
2000-01-03 10:00:00  1.312561
2000-01-03 11:00:00 -1.308502
2000-01-03 12:00:00 -0.515339
2000-01-03 13:00:00  1.536540
2000-01-03 14:00:00  0.108617

撰写回答