按时间过滤 Pandas 数据框。

20

我有一个pandas数据框,我想从中提取大于或小于12pm的时间子集。首先我在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

现在我想根据时间对数据框进行子集化,其中时间大于中午12点并且时间小于中午12点。

segments_data.time[segments_data['time'] < 12:00:00]

不能工作是因为time是一个字符串对象

2个回答

30

更新

来自pandas文档,网址为https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.between_time.html。感谢评论中的Frederick。

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

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

使用between_time函数:

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']))

接下来你可以将datetime转换为一个H:M:S字符串,然后使用between(start,end)函数似乎可以实现:

下一步,您可以将datetime转换为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
它给我一个错误 TypeError: can't compare datetime.time to str - Neil
如果您有一个日期时间列,您可以使用 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.between_time.html - Frederick
9
between_time 要求日期时间必须是索引。我们如何在一列上应用它?我有什么遗漏吗? - nishant
这并没有回答问题。需要过滤的列必须是dt.time列,而不是datetime列。尝试应用此解决方案,它将无效。 - pd441

6

虽然这篇文章已经五年了,但我遇到了同样的问题,并决定发布我的解决方案。我尝试使用between_time函数进行过滤,但是因为要过滤的dataframe时间列不是datetime类型,所以无法使用该函数。

        # 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接