Как извлечь данные из df2 на основе данных datetime в df1 в python - PullRequest
0 голосов
/ 23 октября 2019

Вопрос здесь заключается в том, что я использую 2 набора данных: df1 имеет все данные журнала времени за несколько лет;df2 содержит данные об инцидентах, которые произошли в определенный момент времени. Мне нужно извлечь из df1 сегмент однонедельных данных прямо перед датой и временем IncidentTime в df2 (таким образом, IncidentTime является временем окончания 7-дневного периода дляконкретный Group_Id).

Примечание: Group_Id может иметь более 1 инцидента (т. Е. В df2 может быть несколько строк с одним и тем же Group_Id).

Вот наборы данных:

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
                   ...
2016-03-05 00:00:05.743    101          21
2017-12-24 00:00:10.407    101          33
                   ...

df2

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

Затем создайте новый столбец в окончательных данных для IncidentTime (это будет одинаковым для Group_Id каждый раз). Например, Group_Id = 11 имеет IncidentTime из 27/10/13 16:08, поэтому мы берем все данные из df1 для Group_Id = 11, где его Timestamp лежит между 20/10/13 16:08 и 27/10/13 16:08. Таким образом, наши окончательные данные df3 имеют 7-дневные данные, соответствующие собственным IncidentTime для всех Group_Id:

df3

IncidentTime       Group_Id       Timestamp             Data
27/10/13 16:08      11        2013-10-20 19:10:05.143    14
27/10/13 16:08      11        2013-10-21 00:05:10.377    15
27/10/13 16:08      11        2013-10-22 14:22:15.501    19
                                  ...
27/10/13 16:08      11        2013-10-27 05:22:15.501    20
                                  ...

1 Ответ

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

Можно сначала преобразовать столбцы в дату и затем создать столбец IncidentTime_start, вычтя 7 дней и DataFrame.merge с внешним объединением:

df1['Timestamp'] = pd.to_datetime(df1['Timestamp'])
df2['IncidentTime'] = pd.to_datetime(df2['IncidentTime'], dayfirst=True)
df2['IncidentTime_start'] = df2['IncidentTime'] - pd.offsets.DateOffset(days=7)

df = df2.merge(df1, on='Group_Id', how='outer')

print (df)
         IncidentTime  Group_Id  IncidentTime_start               Timestamp  \
0 2013-10-27 16:08:00        11 2013-10-20 16:08:00 2013-10-20 00:00:05.143   
1 2013-10-27 16:08:00        11 2013-10-20 16:08:00 2013-10-21 00:05:10.377   
2 2013-10-27 16:08:00        11 2013-10-20 16:08:00 2013-10-22 14:22:15.501   
3 2016-12-03 16:11:00         2 2016-11-26 16:11:00                     NaT   
4 2014-10-24 12:08:00        40 2014-10-17 12:08:00                     NaT   
5 2017-07-04 08:00:00       100 2017-06-27 08:00:00                     NaT   
6 2013-04-03 14:10:00        26 2013-03-27 14:10:00                     NaT   
7 2018-11-15 17:00:00        46 2018-11-08 17:00:00                     NaT   
8 2019-02-11 00:20:00       101 2019-02-04 00:20:00 2016-03-05 00:00:05.743   
9 2019-02-11 00:20:00       101 2019-02-04 00:20:00 2017-12-24 00:00:10.407   

    Data  
0   14.0  
1   15.0  
2   19.0  
3    NaN  
4    NaN  
5    NaN  
6    NaN  
7    NaN  
8   21.0  
9  331.0  

А затем отфильтруйте по Series.between с boolean indexing:

df = (df[df['Timestamp'].between(df['IncidentTime_start'], df['IncidentTime'])]
                                                        .drop('IncidentTime_start', axis=1))
print (df)
         IncidentTime  Group_Id               Timestamp  Data
1 2013-10-27 16:08:00        11 2013-10-21 00:05:10.377  15.0
2 2013-10-27 16:08:00        11 2013-10-22 14:22:15.501  19.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...