【问题标题】:Selecting Data between Specific hours in a pandas dataframe在 pandas 数据框中的特定时间之间选择数据
【发布时间】:2013-10-11 07:59:59
【问题描述】:

我的 Pandas Dataframe 框架看起来像这样

 1. 2013-10-09 09:00:05
 2. 2013-10-09 09:05:00
 3. 2013-10-09 10:00:00
 4.  ............
 5.   ............
 6.   ............
 7. 2013-10-10 09:00:05
 8. 2013-10-10 09:05:00 
 9. 2013-10-10 10:00:00

我希望数据位于 9 到 10 小时之间...如果有人从事过类似的工作,那将非常有帮助。

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:
     In [7]: index = date_range('20131009 08:30','20131010 10:05',freq='5T')
    
    In [8]: df = DataFrame(randn(len(index),2),columns=list('AB'),index=index)
    
    In [9]: df
    Out[9]: 
    <class 'pandas.core.frame.DataFrame'>
    DatetimeIndex: 308 entries, 2013-10-09 08:30:00 to 2013-10-10 10:05:00
    Freq: 5T
    Data columns (total 2 columns):
    A    308  non-null values
    B    308  non-null values
    dtypes: float64(2)
    
    In [10]: df.between_time('9:00','10:00')
    Out[10]: 
                                A         B
    2013-10-09 09:00:00 -0.664639  1.597453
    2013-10-09 09:05:00  1.197290 -0.500621
    2013-10-09 09:10:00  1.470186 -0.963553
    2013-10-09 09:15:00  0.181314 -0.242415
    2013-10-09 09:20:00  0.969427 -1.156609
    2013-10-09 09:25:00  0.261473  0.413926
    2013-10-09 09:30:00 -0.003698  0.054953
    2013-10-09 09:35:00  0.418147 -0.417291
    2013-10-09 09:40:00  0.413565 -1.096234
    2013-10-09 09:45:00  0.460293  1.200277
    2013-10-09 09:50:00 -0.702444 -0.041597
    2013-10-09 09:55:00  0.548385 -0.832382
    2013-10-09 10:00:00 -0.526582  0.758378
    2013-10-10 09:00:00  0.926738  0.178204
    2013-10-10 09:05:00 -1.178534  0.184205
    2013-10-10 09:10:00  1.408258  0.948526
    2013-10-10 09:15:00  0.523318  0.327390
    2013-10-10 09:20:00 -0.193174  0.863294
    2013-10-10 09:25:00  1.355610 -2.160864
    2013-10-10 09:30:00  1.930622  0.174683
    2013-10-10 09:35:00  0.273551  0.870682
    2013-10-10 09:40:00  0.974756 -0.327763
    2013-10-10 09:45:00  1.808285  0.080267
    2013-10-10 09:50:00  0.842119  0.368689
    2013-10-10 09:55:00  1.065585  0.802003
    2013-10-10 10:00:00 -0.324894  0.781885
    

    【讨论】:

    • 这正是我一直在寻找的,SO 上有许多其他解决方案似乎没有提到这种简单的内置方式。
    • between_time() 是一个较新的功能
    • between_time 是在 0.9.1 上添加的;这是 3 个主要版本之前的版本
    • @Jeff 如果打算保持数据包含日期范围并将范围之外的所有内容设置为 0,以便在不更改日期时间索引的情况下进行绘图,脚本将如何更改?
    【解决方案2】:

    在拆分原始列后创建一个新列。使用以下代码将您的时间划分为小时、分钟和秒:-

    df[['h','m','s']] = df['Time'].astype(str).str.split(':', expand=True).astype(int)
    

    完成后,您必须通过过滤来选择数据:-

    df9to10 =df[df['h'].between(9, 10, inclusive=True)]
    

    而且,它是动态的,如果你想在 9 点到 10 点之间再取一个时间段。

    【讨论】:

      【解决方案3】:

      另一种使用query 的方法。使用 Python 3.9 测试。

      from Pandas import Timestamp
      from datetime import time
      df = pd.DataFrame({"timestamp": 
      [Timestamp("2017-01-03 09:30:00.049"), Timestamp("2017-01-03 09:30:00.049"),
       Timestamp("2017-12-29 16:12:34.214"), Timestamp("2017-12-29 16:17:19.006")]})
      df["time"] = df.timestamp.dt.time
      start_time = time(9,20,0)
      end_time = time(10,0,0)
      df_times = df.query("time >= @start_time and time <= @end_time")
      

      在:

                    timestamp
      2017-01-03 09:30:00.049
      2017-01-03 09:30:00.049
      2017-12-29 16:12:34.214
      2017-12-29 16:17:19.006
      

      输出:

                    timestamp             time
      2017-01-03 09:30:00.049  09:30:00.049000
      2017-01-03 09:30:00.049  09:30:00.049000
      

      作为奖励,可以在查询中使用任意复杂的表达式,例如在两个不同的时间范围内选择所有内容(between_time 是不可能的)。

      【讨论】:

        【解决方案4】:

        假设您的原始数据框称为“df”,而您的时间列称为“time”,这将起作用:(其中 start_time 和 end_time 对应于您想要的时间间隔)

        >>> df_new = df[(df['time'] > start_time) & (df['time'] < end_time)]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-04
          • 2019-07-14
          • 1970-01-01
          • 1970-01-01
          • 2018-04-17
          • 2020-04-29
          • 2019-07-14
          相关资源
          最近更新 更多