Python - объединяет данные по временным интервалам (R data.table mimic?) - PullRequest
0 голосов
/ 03 марта 2019

Я только изучаю Python и у меня есть вопрос об интеграции фреймов данных по времени.Например, скажем, у меня есть 2 отдельных фрейма данных с нерегулярными временными интервалами, но сгруппированных по study_id.Я хотел бы объединить строки, которые приходят в течение 2 часов друг от друга.

Ранее я использовал для этого пакет data.table в R.Пример этого кода ниже.

df_new <- df1[df2, on="Study_ID", allow.cartesian=T][difftime(`date_df1`, `date_df2`, units="hours") <= 2 & difftime(`date_df1`, `date_df2`, units="hours") >= - 2] 

Этот код затем связывает каждый экземпляр, где есть даты, которые находятся в пределах 2 часов от каждого для каждого фрейма данных.Я смотрю, чтобы увидеть, есть ли подобный код для Python?В идеале я хотел бы объединить эти строки, чтобы найти максимальное значение, которое возникает между измерениями, которые происходят в течение 2 часов до или после измерений.

Есть мысли?Спасибо!

Редактировать: пример фреймов данных

    ID   Date           HeartRate
    1    4/1/2019 04:13     56
    1    4/2/2019 05:30     45
    1    4/3/2019 22:10     61
    2    4/3/2019 23:13     62
    2    4/5/2019 15:10     67

    df2
    ID   Date             Weight
     1    4/1/2019 06:10     112
     1    4/2/2019 02:30     114
     1    4/3/2019 21:10     112.5
     2    4/3/2019 23:10     113
     2    4/4/2019 00:00     114

    Output (this is what I would love!)
    ID   Date(blood pressure)  HeartRate   Date(weight)   Weight
    1    4/1/2019 4:13            56       4/1/2019 06:10   112
    1    4/3/2019 22:10           61       4/3/2019 21:10   112.5
    2    4/3/2019 23:13           62       4/3/2019 23:10   113
    2    4/3/2019 23:13           62       4/4/2019 00:00   114

В этом примере вторая строка в каждом фрейме просто удаляется, так как эти измерения не отбрасывают пару в течение 2 часов.Но вторая-последняя строка, показанная в df1, повторяется, потому что в df2 есть 2 случая, которые находятся в пределах 2 часов.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Я хочу поблагодарить @josemz за его оригинальный, прекрасный ответ!Это помогло, и мой длинный список вопросов был о проблемах, которые возникали из-за ошибок в моей очистке данных.Большое спасибо за Вашу помощь!

0 голосов
/ 06 марта 2019

Сначала вам нужно сохранить даты как дату и время, затем вы можете сделать что-то похожее на то, что вы делали в data.table, вы выполняете объединение между двумя информационными кадрами, а затем фильтруете записи, у которых разница во времени меньше чем за два часа..

# store as datetime
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])

# join dataframes
merged = df1.merge(df2, left_on='ID', right_on='ID', 
                   suffixes=('(blood pressure)', '(weight)'))     
# calculate hour difference between the two dates
hour_dif = np.abs(merged['Date(blood pressure)'] - merged['Date(weight)'])/np.timedelta64(1, 'h')
merged[hour_dif < 2]

Что дает

#    ID Date(blood pressure)  HeartRate        Date(weight)  Weight
# 0   1  2019-04-01 04:13:00         56 2019-04-01 06:10:00   112.0
# 8   1  2019-04-03 22:10:00         61 2019-04-03 21:10:00   112.5
# 9   2  2019-04-03 23:13:00         62 2019-04-03 23:10:00   113.0
...