我正在尝试遍历DataFrame索引中的每一行,并删除不在特定时间之间的所有行。
我一直在寻找解决方案,但没有一个将日期与时间分开,我想要做的就是删除超出时间范围的行。
答案 0 :(得分:19)
您可以直接使用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_start
和include_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
答案 1 :(得分:3)
你也可以这样做:
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的工作方式相同。
答案 2 :(得分: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
是日期时间。
这里我们找到了不在时间范围内的 indexe,并将它们放在适当的位置。