Как нарезать строки между временными интервалами на индивидуальной основе Python - PullRequest
0 голосов
/ 24 октября 2019

Я хочу нарезать строки в df1 между временными интервалами StartTime и EndTime в df2 в зависимости от конкретного случая (по значениям в столбце Group_Id в df2). Затем объедините несколько фрагментов вместе, если они имеют одинаковый формат.

Итак, это df1:

      Timestamp           Group_Id      Data
2013-10-20 00:00:05.143    11           14
2013-10-21 00:05:10.377    11           15
2013-10-22 14:22:15.501    11           19
                   ...
2019-02-05 00:00:05.743    101          21
2019-02-10 00:00:10.407    101          33

и df2:

EndTime          StartTime             Group_Id
27/10/13 16:08   20/10/13 16:08          11
03/12/16 16:11   26/11/16 16:11          2
24/10/14 12:08   17/10/14 12:08          11
04/07/17 08:00   27/06/17 08:00          100
03/04/13 14:10   27/03/13 14:10          26
15/11/18 17:00   08/11/18 17:00          46
11/02/19 00:20   04/02/19 00:20          101

Шаг 1: Мы начинаем с первой строки в столбце Group_Id, df2: 11

Step2: скопируйте и вставьте соответствующие строки в df1, которые лежат между EndTime & StartTime для Group_Id==11

Step3: Concatвсе нарезанные подмножества из каждой строки в Group_Id (df2)

Надеемся, окончательный набор данных df3 выглядит следующим образом:

Group_Id EndTime         StartTime      Timestamp                 Data
11       27/10/13 16:08  20/10/13 16:08 2013-10-20 20:00:05.143   14
11       27/10/13 16:08  20/10/13 16:08 2013-10-21 00:05:10.377   15
11       27/10/13 16:08  20/10/13 16:08 2013-10-22 14:22:15.501   19
                             ...
101      11/02/19 00:20  04/02/19 00:20 2019-02-05 00:00:05.743   21
101      11/02/19 00:20  04/02/19 00:20 2019-02-10 00:00:10.407   33
                             ...

Плохой псевдокод:

for i in df2['Group_Id']:
  if i = df1['Group_Id'],
  dfxx = df1[(df1['Timestamp'] <= df2.loc[i, 'EndTime']) & df1['Timestamp'] > (df2.loc['EndTime'] - dt.timedelta(days=7)])                                                                   
  pd.concat(dfxx for all i)
  i = i+1 

Надеюсь, это поможет лучше проиллюстрировать проблему.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Конвертировать df1.Timestamp в дату и время. Слить на Group_Id. Создайте IntervalIndex из start и end из df3. Используйте listcomp для создания маски True / False m и фрагмента df3.

df1.Timestamp = pd.to_datetime(df1.Timestamp)
df3 = df2.merge(df1, on='Group_Id')
iix = pd.IntervalIndex.from_tuples([*df3[['StartTime','EndTime']].apply(pd.to_datetime, dayfirst=True).to_records(index=False)], 
                                   closed='both')
m = [x in iix[i] for i, x in enumerate(df3.Timestamp)]

df3.loc[m]

Out[494]:
          EndTime       StartTime  Group_Id               Timestamp  Data
0  27/10/13 16:08  20/10/13 16:08        11 2013-10-20 20:00:05.143    14
1  27/10/13 16:08  20/10/13 16:08        11 2013-10-21 00:05:10.377    15
2  27/10/13 16:08  20/10/13 16:08        11 2013-10-22 14:22:15.501    19
6  11/02/19 00:20  04/02/19 00:20       101 2019-02-05 00:00:05.743    21
7  11/02/19 00:20  04/02/19 00:20       101 2019-02-10 00:00:10.407    33
0 голосов
/ 24 октября 2019

Вы сможете выполнить это с помощью слияния, основанного на вашем примере.

df1.merge(df2,on='Group_Id',how='left')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...