Python 按时间筛选数据帧

Python 按时间筛选数据帧,python,datetime,pandas,Python,Datetime,Pandas,我有一个熊猫数据帧,我想在大于或小于12点的时间子集。首先,我将字符串datetime转换为pandas中的datetime[64]ns对象 segments_data['time'] = pd.to_datetime((segments_data['time'])) 然后我将时间、日期、月份、年份和星期几分开,如下所示 import datetime as dt segments_data['date'] = segments_data.time.dt.date segments_data

我有一个熊猫数据帧,我想在大于或小于12点的时间子集。首先,我将字符串datetime转换为pandas中的datetime[64]ns对象

segments_data['time'] = pd.to_datetime((segments_data['time']))
然后我将时间、日期、月份、年份和星期几分开,如下所示

import datetime as dt

segments_data['date'] = segments_data.time.dt.date
segments_data['year'] = segments_data.time.dt.year
segments_data['month'] = segments_data.time.dt.month
segments_data['dayofweek'] = segments_data.time.dt.dayofweek
segments_data['time'] = segments_data.time.dt.time
我的时间专栏如下所示

segments_data['time']
Out[1906]: 
  07:43:00
  07:52:00
  08:00:00
  08:42:00
  09:18:00
  09:18:00
  09:18:00
  09:23:00
  12:32:00
  12:43:00
  12:55:00
  Name: time, dtype: object
现在,我想对时间大于12pm且时间小于12pm的数据帧进行子集

segments_data.time[segments_data['time'] < 12:00:00]
segments\u data.time[段数据['time']<12:00:00]

它不起作用,因为时间是一个字符串对象

从熊猫博士在。感谢弗雷德里克的评论

创建包含日期时间的数据框:

i = pd.date_range('2018-04-09', periods=4, freq='1D20min')
ts = pd.DataFrame({'A': [1, 2, 3, 4]}, index=i)
ts
                     A
2018-04-09 00:00:00  1
2018-04-10 00:20:00  2
2018-04-11 00:40:00  3
2018-04-12 01:00:00  4
在时间之间使用

ts.between_time('0:15', '0:45')
                     A
2018-04-10 00:20:00  2
2018-04-11 00:40:00  3
通过将开始时间设置为晚于结束时间,可以获得不在两个时间之间的时间:

ts.between_time('0:45', '0:15')
                     A
2018-04-09 00:00:00  1
2018-04-12 01:00:00  4

旧答案

保留一列作为原始日期时间,将其称为
ts

segments_data['ts'] = pd.to_datetime((segments_data['time']))
接下来,您可以将日期时间强制转换为
H:M:S
字符串,并使用
between(start,end)
似乎有效:

In [227]:
segments_data=pd.DataFrame(x,columns=['ts'])
segments_data.ts = pd.to_datetime(segments_data.ts)
segments_data
Out[227]:
ts
0   2016-01-28 07:43:00
1   2016-01-28 07:52:00
2   2016-01-28 08:00:00
3   2016-01-28 08:42:00
4   2016-01-28 09:18:00
5   2016-01-28 09:18:00
6   2016-01-28 09:18:00
7   2016-01-28 09:23:00
8   2016-01-28 12:32:00
9   2016-01-28 12:43:00
10  2016-01-28 12:55:00

In [228]:    
 segments_data[segments_data.ts.dt.strftime('%H:%M:%S').between('00:00:00','12:00:00')]
Out[228]:
ts
0   2016-01-28 07:43:00
1   2016-01-28 07:52:00
2   2016-01-28 08:00:00
3   2016-01-28 08:42:00
4   2016-01-28 09:18:00
5   2016-01-28 09:18:00
6   2016-01-28 09:18:00
7   2016-01-28 09:23:00

它给了我一个错误
TypeError:无法将datetime.time与str进行比较
如果您有datetime列,则可以使用
between\u time
要求将datetime作为索引。我们如何将其应用于一列?我错过什么了吗?