我有一个pandas数据框,我希望按时间大于或小于12 pm进行子集化。首先我将我的字符串日期时间转换为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]
它不起作用,因为time
是string object
。
答案 0 :(得分:6)
将列保留为原始日期时间,将其命名为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
似乎有效:
{{1}}
答案 1 :(得分:0)
尽管这篇文章已经有 5 年的历史了,但我还是遇到了同样的问题,并决定发布我能够开始工作的内容。我尝试了 between_time 函数,但这对我不起作用,因为数据帧上的索引必须是日期时间,我想使用数据帧时间列之一进行过滤。
# Import datetime libraries
from datetime import datetime, date, time
avail_df['Start'].dt.time
1 08:36:44
2 08:49:14
3 09:26:00
5 08:34:22
7 08:34:19
8 09:09:05
9 12:27:43
10 12:29:14
12 09:05:55
13 09:14:11
14 09:21:41
15 11:28:26
16 12:25:10
17 16:02:52
18 08:53:51
# Use "time()" function to create start/end parameter I used 9:00am for this example
avail_df.loc[avail_df['Start'].dt.time > time(9,00)]
3 09:26:00
8 09:09:05
9 12:27:43
10 12:29:14
12 09:05:55
13 09:14:11
14 09:21:41
15 11:28:26
16 12:25:10
17 16:02:52
20 09:04:50
21 09:21:35
22 09:22:05
23 09:47:05
24 09:55:05