Pandas按时间过滤 Dataframe

a6b3iqyw  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(115)

这不是以下内容的副本:filter pandas dataframe by time,因为那里提供的解决方案不能处理需要筛选的相同列类型。
我有以下 Dataframe :

i = pd.date_range('2018-04-09', periods=4, freq='1D20min')
ts = pd.DataFrame({'A': [1, 2, 3, 4],
               'B':i})
ts['date'] = pd.to_datetime(ts['B']).dt.date
ts['time'] = pd.to_datetime(ts['B']).dt.time
ts = ts.drop('B', axis = 1)

我想只筛选time列,我尝试了以下方法:

ts['time'].between_time('0:45', '0:15')

但它不工作。我得到错误:TypeError: Index must be DatetimeIndex
你知道怎么做吗?谢谢

m1m5dgzv

m1m5dgzv1#

编辑:没有B列的解决方案:
如果需要按time列过滤,则使用Series.between

from datetime import  time

df = ts[ts['time'].between(time(0,15,0), time(0,45,0))]
print (df)
   A                   B        date      time
1  2 2018-04-10 00:20:00  2018-04-10  00:20:00
2  3 2018-04-11 00:40:00  2018-04-11  00:40:00

B色谱柱的原始溶液:
创建DatetimeIndex,如果需要按DataFrame.between_time过滤:

df = ts.set_index('B').between_time('0:15', '0:45')
print (df)
                     A        date      time
B                                           
2018-04-10 00:20:00  2  2018-04-10  00:20:00
2018-04-11 00:40:00  3  2018-04-11  00:40:00

再次使用DatetimeIndexDatetimeIndex.indexer_between_time求解匹配行的位置,并通过DataFrame.iloc进行选择:

df = ts.iloc[ts.set_index('B').index.indexer_between_time('0:15', '0:45')]
print (df)
   A                   B        date      time
1  2 2018-04-10 00:20:00  2018-04-10  00:20:00
2  3 2018-04-11 00:40:00  2018-04-11  00:40:00

相关问题