17

我正在尝试遍历 DataFrame 索引中的每一行并删除不在特定时间之间的所有行。

我一直在寻找解决方案,但它们都没有将日期与时间分开,我想做的就是删除时间范围之外的行。

4

3 回答 3

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_startFalse意味着时间部分精确的日期时间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
于 2013-01-26T19:08:54.680 回答
3

你也可以这样做:

rng = pd.date_range('1/1/2000', 周期=24, 频率='H')
ts = pd.Series(pd.np.random.randn(len(rng)), index=rng)
ts.ix[datetime.time(10):datetime.time(14)]
输出[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
频率:H,数据类型:float64

DataFrame 的工作方式相同。

于 2013-07-28T21:53:05.733 回答
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

在这里,我们找到不在时间范围内的索引并将其删除。

于 2021-03-11T13:19:31.977 回答