Nano Hash - криптовалюты, майнинг, программирование

Присоединитесь к двум кадрам данных с двумя столбцами [один из столбцов даты и времени] в R

У меня есть два df, и я пытаюсь присоединиться к ним влево или вправо на основе двух столбцов. Столбец идентификатора и даты и времени. как разрешить DateTime из другого df соответствовать первому df, даже если он находится в пределах 10-20 секунд разницы?

df1 :

ID Datetime
123 2021-04-02 09:50:11
456 2021-04-02 09:50:15

df2:

ID Datetime
123 2021-04-02 09:50:31
456 2021-04-02 09:50:23

если время находится в пределах 10-20 diff на df2, верните все столбцы и столбец DateTime из df2 в новый, df3. Для всех совпадающих идентификаторов и гггг-мм-дд H:M соответствует обоим dfs. поэтому, если изменение в: SS находится между 10-20 на df2, выберите его и присоединитесь, если оно не в пределах 10-20 секунд, пропустите. кто-нибудь, пожалуйста, помогите?

11.07.2021

  • Ваше состояние не ясно. Это основано на всех идентификаторах или где бы это ни происходило 11.07.2021
  • @akrun Для всех совпадающих идентификаторов и yyyy-mm-dd H:M соответствует обоим dfs. поэтому, если изменение :SS составляет от 10 до 20 на df2, выберите его и присоединяйтесь. 11.07.2021
  • Меня смущает то, что если хотя бы один из идентификаторов имеет разницу не между 10 и 20, тогда вы используете «df1» как df3 11.07.2021
  • @akrun Если это не в пределах 10-20 секунд, пропустите это, и оно не будет использоваться при присоединении 11.07.2021
  • Почему бы сначала не объединиться по идентификатору, а затем добавить переменную, которая вычисляет разницу между двумя значениями времени, а затем отфильтровать те случаи, различия в которых находятся в желаемом диапазоне? 11.07.2021
  • Предоставьте достаточно больших данных, по крайней мере, с 10-15 строками, используя dput. См. как привести воспроизводимый пример . Покажите ожидаемый результат для общих данных. Это облегчит другим людям помощь. 11.07.2021

Ответы:


1

Ваши образцы данных очень минималистичны. Не уверен, как вы хотели реализовать 10-20 секунд. Я предположил, что все в пределах от -20 до +20 секунд должно совпадать. Это можно легко настроить в части фильтрации ID == i.ID & Datetime <= (i.Datetime + 20) & Datetime >= (i.Datetime - 20).

Вот data.table подход

library(data.table)
# Sample data
DT1 <- fread("ID    Datetime
123     2021-04-02T09:50:11
456     2021-04-02T09:50:15")
DT2 <- fread("ID    Datetime
123     2021-04-02T09:50:31
456     2021-04-02T09:50:23")
# Set datetimes to posix
DT1[, Datetime := as.POSIXct(Datetime)]
DT2[, Datetime := as.POSIXct(Datetime)]

# possible rowwise approach
DT1[, rowid := .I]
setkey(DT1, rowid)
DT1[DT1, Datetime2 := DT2[ID == i.ID & Datetime <= (i.Datetime + 20) & Datetime >= (i.Datetime - 20),
                          lapply(.SD, paste0, collapse = ";"), .SDcols = c("Datetime")],
    by = .EACHI][, rowid := NULL][]

#     ID            Datetime           Datetime2
# 1: 123 2021-04-02 09:50:11 2021-04-02 09:50:31
# 2: 456 2021-04-02 09:50:15 2021-04-02 09:50:23
11.07.2021

2

Если я правильно понимаю, ОП хочет получить те строки df2 (включая все столбцы), которые имеют совпадающие ID в df1 и, где разница во времени меток времени Datetime между df1 и df2 меньше или равно заданному значению.

Итак, для заданных выборочных данных

  • если допустимая разница во времени составляет не более 20 секунд, возвращаются обе строки df2.
  • Если допустимая разница во времени составляет не более 10 секунд, возвращается только вторая строка df2 с ID == 456.
  • Если допустимая разница во времени составляет не более 5 секунд, возвращается пустой набор данных, поскольку ни одна из df2 строк не удовлетворяет условиям.

Одним из возможных подходов является использование неэквивалентного соединения, которое доступно с data.table:

library(data.table)
timediff <- 10 # given time difference in seconds
setDT(df1)[, Datetime := as.POSIXct(Datetime)] 
setDT(df2)[, Datetime := as.POSIXct(Datetime)]
df2[, c("from", "to") := .(Datetime - timediff, Datetime + timediff)]
df3 <- df2[df1, on = c("ID", "from <= Datetime", "to >= Datetime"), 
           nomatch = NULL, .SD][
             , c("from", "to") := NULL][]
df3
    ID            Datetime
1: 456 2021-04-02 09:50:23

Если код запускается с

timediff <- 20

результат

df3
    ID            Datetime
1: 123 2021-04-02 09:50:31
2: 456 2021-04-02 09:50:23

Если код запускается с

timediff <- 5

df3 становится пустой таблицей данных.

EDIT: Show Datetime from df1 and df2

Автор запрос OP, вот версия, которая возвращает оба столбца Datetime из df1 и df2, переименованных в Datetime1 и Datetime2, соответственно:

library(data.table)
timediff <- 20 # given time difference in seconds
setDT(df1)[, Datetime := as.POSIXct(Datetime)] 
setDT(df2)[, Datetime := as.POSIXct(Datetime)]
df2[, c("from", "to") := .(Datetime - timediff, Datetime + timediff)]
df3 <- df2[setDT(df1), on = c("ID", "from <= Datetime", "to >= Datetime"), 
           nomatch = NULL, .(ID, Datetime1 = i.Datetime, Datetime2 = x.Datetime)]
df3
    ID           Datetime1           Datetime2
1: 123 2021-04-02 09:50:11 2021-04-02 09:50:31
2: 456 2021-04-02 09:50:15 2021-04-02 09:50:23
11.07.2021
  • Как включить оба столбца даты и времени в df3? когда timediff‹-20 ? @Уве 14.07.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..