【问题标题】:filter pandas dataframe by time按时间过滤熊猫数据帧
【发布时间】:2016-05-05 07:25:32
【问题描述】:

我有一个 pandas 数据框,我想在下午 12 点多或少于 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

现在我想对时间大于 12 点且时间小于 12 点的数据帧进行子集化。

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

它不起作用,因为time 是string object。

【问题讨论】:

    标签: python datetime pandas


    【解决方案1】:

    更新

    来自https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.between_time.html 的 pandas 文档。感谢 cmets 中的 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
    

    您可以通过将 start_time 设置为晚于 end_time 来获得不在两次之间的时间:

    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: can't compare datetime.time to str
    • 如果你有一个日期时间列,你可以使用pandas.pydata.org/pandas-docs/stable/reference/api/…
    • between_time 要求将日期时间作为索引。我们如何将它应用于一列?我错过了什么吗?
    【解决方案2】:

    尽管这篇文章已有 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-20
      • 2015-12-13
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2022-11-30
      相关资源
      最近更新 更多