【问题标题】:select rows in between period bounds and put them into an array | python | pandas dataframe选择周期边界之间的行并将它们放入数组中 |蟒蛇 |熊猫数据框
【发布时间】:2016-01-06 09:14:46
【问题描述】:

我有两个数据框,第一个 df 像这样

date_time             value     member
2013-10-09 09:00:00  664639  Jerome
2013-10-09 09:05:00  197290  Hence
2013-10-09 09:10:00  470186  Ann
2013-10-09 09:15:00  181314  Mikka
2013-10-09 09:20:00  969427  Cristy
2013-10-09 09:25:00  261473  James
2013-10-09 09:30:00  003698  Oliver

和第二个数据框bounds 我有这样的界限:

   date_start            date_end
2013-10-09 09:19:00         2013-10-09 09:25:00
2013-10-09 09:25:00         2013-10-09 09:40:00 

所以我需要从第一个表中选择 date_start 和 date_end 之间的行,并将每个选择放入数组中。 我尝试了以下代码:

  def create_interval():
        intervals=[]
        for i in range(1,len(bounds)):
            for j in range(1, len(df)):
                mask[i] = df[(df['date'][j] > bounds.date_start[i]) & (df['date'][j] < bounds.date_end[i])]
                df_interval[i]=df.loc[mask[i]]
                intervals.append(df_interval.values)
            return intervals

我得到这个错误:

  pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3824)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3704)()

pandas/hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12280)()

pandas/hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12231)()

KeyError: False

我认为索引有问题,但我不确定。可能在遍历行时存在问题,或者选择 date_time 的间隔,或者将选择值存储在数组中

我是 python 的初学者,所以欢迎任何帮助!

【问题讨论】:

    标签: python arrays loops pandas dataframe


    【解决方案1】:

    最后适合我的方法如下:

     mask = (df['date_time'] > start_date) & (df['date_time'] < end_date)
    

    所以我将@Fabio 建议我的一些转换与上述方法混合在一起,并创建了 我需要的数组。我想between_time 方法不适用于日期,仅适用于时间,因此它无法识别日期时间类型,并抛出错误TypeError: Index must be DatetimeIndex 但如果我错了请告诉我! 所以我的最终功能看起来像:

    def create_interval():
        intervales=[]
        for index, row in bounds.iterrows():
            s = row['date_start']
            e = row['date_end']
            mask = (df['date_time'] > s) & (df['date_time'] < e)
            df_interval=df.loc[mask]
            intervales.append(df_interval.values)
        return intervales
    

    非常感谢@Fabio 的参与和帮助

    【讨论】:

      【解决方案2】:

      我会将dfdate_time 列作为日期传递,并将其设置为索引:

      df = df.set_index(['date_time'])
      

      然后我将应用between_time pandas 函数按bounds 数据框给出的开始和结束日期过滤数据框:

      for index,row in bounds.iterrows():
      
           s = row['date_start']
           e = row['date_end']
           d = df.between_time(s,e)
      

      这会返回(对于bounds 的每一行):

                            value  member
      date_time                          
      2013-10-09 09:20:00  969427  Cristy
      2013-10-09 09:25:00  261473   James
      
                            value  member
      date_time                          
      2013-10-09 09:25:00  261473   James
      2013-10-09 09:30:00    3698  Oliver
      

      希望对您有所帮助。

      编辑: 如果您需要将结果放入数组中,您可以调用:

      d.values
      

      返回(用于第二行选择):

      [[261473 'James']
       [3698 'Oliver']]
      

      【讨论】:

      • @fuzzzy_09 你必须用df = df.set_index(['date_time'])将'date_time'列设置为索引,否则between_time方法不起作用。
      • 正如我之前在评论中提到的那样,我用这行 f=df.set_index(['date_time']) 做到了,但它不起作用!
      • 对我来说它有效,你如何导入数据框?我通过 .csv 文件读取它,其中 parse_dates 选项为 df = pd.read_csv('youfile.csv',parse_dates=['date_time']),或者您可以使用 df['date_time'] = pd.to_datetime(df['date_time']) 将其设置为日期时间。
      • 对我来说同样的导入!但是让我们看看,我遍历了bounds 数据帧中的行,所以我想它的索引有问题?
      • 我不知道,我已将边界作为 .csv 文件导入,没有 bounds = pd.read_csv('bounds.csv') 选项。你的代码有问题,应该是s = row['date_start']而不是s = bounds['date_start'],结束时间也一样。
      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 2021-02-18
      • 2022-01-25
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多