#python #r #date #time-series #data.table
#python #r #Дата #временные ряды #data.table
Вопрос:
Я только изучаю 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 amp; 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 часов.
Комментарии:
1. Можете ли вы показать нам пример фрейма данных? Мне трудно представить, о какой оси и измерениях мы здесь говорим.
2. @NoSplitSherlock Я отредактировал, чтобы добавить пример, спасибо 🙂
3. @molecularrunner Вы все еще заинтересованы в решении этой проблемы? Я думаю, что могу вам помочь, но мое решение не включает последнюю запись, поскольку между ними промежуток времени составляет 23 часа, если только дата взвешивания на самом деле не 4/4/2019.
Ответ №1:
Сначала вам нужно сохранить ваши даты как datetime, затем вы можете сделать что-то похожее на то, что вы делали в 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
Комментарии:
1. спасибо @josemz. Я начну с этого. Однако я не уверен, что этот пример поможет, так это тот факт, что может быть несколько измерений веса перед частотой сердечных сокращений или наоборот. Поэтому я не обязательно хочу привязывать только соответствующие строки в каждом фрейме данных.
2. @molecularrunner не стесняйтесь редактировать простые данные в вашем вопросе, чтобы учесть эти случаи.
3. Итак, случаи, как я объяснил, были отражены в исходных данных, где я попытался показать привязку 03.04.2019 23: 13 к двум отдельным измерениям веса, которые были выполнены в течение 2 часов.
4. Итак, последняя запись должна была быть 4/4/2019 00:00?
5. И я прошу прощения, вы уже указали мне на это. И я попробовал ваше решение, но затем стал получать ошибки с памятью, и я не чувствую, что мой набор данных настолько велик