检查日期是不是在另一个数据框中的两个日期之间,如果是则操作日期

     2023-05-08     126

关键词:

【中文标题】检查日期是不是在另一个数据框中的两个日期之间,如果是则操作日期【英文标题】:Check if date is between two dates in another data frame, and manipulate date if it is检查日期是否在另一个数据框中的两个日期之间,如果是则操作日期 【发布时间】:2019-08-14 20:29:22 【问题描述】:

我有两个数据框(df1 和 df2);它们每个都有一个 ID 列,并按 ID 号组织,每个数据帧的每个 ID 有很多行。 df1 有一个“unique_posix”列,df2 有一个“date.time.start”和“date.time.end”列,还有一个“depth”和“shape”列。 对于每个 ID,我想从 df1 中获取我的“unique_posix”列并转到 df2 并找到它介于两者之间或之上的“date.time.start”和“date.time.end”。当我找到它对应的行时,我想从 df2 中提取“深度”和“形状”,并将其复制到 df1 中该唯一日期/时间的新列。

我已经尝试使用 if/else 作为 for 循环来执行此操作,并且我已尝试在 dplyr 中执行此操作。

df1<-data.frame(ID=c('SW12','SW12','SW12','SW12','SW12','SW13','SW13','SW13','SW13','SW13'), unique_posix=c('5/3/10 16:47','5/3/10 16:53','5/3/10 17:00', '5/3/10 18:00','5/3/10/ 18:12','8/15/10 17:13','8/15/10 17:18','8/15/10 17:37','8/15/10 18:00','8/15/10 18:52'))

df2<- data.frame(ID=c('SW12','SW12','SW12','SW12','SW12','SW13','SW13','SW13','SW13','SW13'), Date.Time.Start=c('5/3/10 15:57','5/3/10 16:18', '5/3/10 16:55','5/3/10 17:36','5/3/10 18:17','8/15/10 16:55','8/15/10 17:28','8/15/10 17:54', '8/15/10 18:55','8/15/10 19:20'), Date.Time.End=c('5/3/10 16:09','5/3/10 16:44','5/3/10 17:28', '5/3/10 18:08', '5/3/10 18:49', '8/15/10 17:22', '8/15/10 17:52','8/15/10 18:06','8/15/10 19:15','8/15/10 19:40'), Shape=c('U','U','V','Square','U','U','U','Square','V','U'), Depth=c(1,2,3,4,5,6,7,8,9,10))

我希望 df1 最终看起来像:

df1b<-data.frame(ID=c('SW12','SW12','SW12','SW12','SW12','SW13','SW13','SW13','SW13','SW13'), unique_posix=c('5/3/10 16:47','5/3/10 16:53','5/3/10 17:00', '5/3/10 18:00','5/3/10/ 18:12','8/15/10 17:13','8/15/10 17:18','8/15/10 17:37','8/15/10 18:00','8/15/10 18:52'), Dive.Shape=c(NA,NA,'V','Square',NA,'U','U','U','Square', NA),Dive.Depth=c(NA,NA,3,4,NA,6,6,7,8,NA))

我已将日期/时间转换为 POSIXct/lt:

library(dplyr)
df1 <- df1 %>% 
  mutate(
    ID = factor(ID),
    unique_posix = mdy_hm(unique_posix)
  )
class(df1$unique_posix)

df2 <- df2 %>% 
  mutate(
    ID = factor(ID),
    Date.Time.Start = mdy_hm(Date.Time.Start),
    Date.Time.End = mdy_hm(Date.Time.End)
  )
class(df2$Date.Time.Start)

作为一个for循环我试过了:

df1b<-df1
for (i in 1:nrow(df1)) 
  if (df1$unique_posix %within% interval(df2$Date.Time.Start, df2$Date.Time.End)) 
    df1b$Dive.Shape<-df2$Shape
    df1b$Dive.Depth<-df2$Depth
  
  else 
    df1b$Dive.Shape<-NA
    df2b$Dive.Depth<-NA
  

在 dplyr 我正在尝试这样的事情:

df1b<-inner_join(df1, df2, by="DeployID")
df1b %>% rowwise() %>%
  mutate(Dive.Shape=ifelse(between(unique_posix, Date.Time.Start, Date.Time.End),Shape,NA )) %>%
mutate(Dive.Depth=ifelse(between(unique_posix, Date.Time.Start, Date.Time.End),Depth,NA ))
  arrange(DeployID,desc(unique_posix)) %>%
  distinct(unique_posix)

这些似乎都不起作用,但我觉得我很接近?

我希望我的 df1b 有两个额外的 Dive.Shape 和 Dive.Depth 列,如果 unique_posix 日期/时间不在 Date.Time 之内或之上,则它将包含一个“NA”。 df2 框架中的 Start 和 Date.Time.End 范围[对于每个 ID]。如果 df1 的 unique_posix 介于 df2 的 Date.Time.Start 或 Date.Time.End 列之间或之上,则这些列将包含来自 df2 的 Shape 和 df2 的 Depth 列的值。

感谢您为我提供的任何帮助!

【问题讨论】:

【参考方案1】:

对于data.table,使用非等更新连接相对简单:

library(data.table)
setDT(df1)
setDT(df2)

df1[df2
    , on = .(ID
             , unique_posix > Date.Time.Start
                , unique_posix < Date.Time.End)
    , `:=`(Dive.Shape = Shape, Dive.Depth = Depth)]

df1

> df1
      ID        unique_posix Dive.Shape Dive.Depth
 1: SW12 2010-05-03 16:47:00       <NA>         NA
 2: SW12 2010-05-03 16:53:00       <NA>         NA
 3: SW12 2010-05-03 17:00:00          V          3
 4: SW12 2010-05-03 18:00:00     Square          4
 5: SW12 2010-05-03 18:12:00       <NA>         NA
 6: SW13 2010-08-15 17:13:00          U          6
 7: SW13 2010-08-15 17:18:00          U          6
 8: SW13 2010-08-15 17:37:00          U          7
 9: SW13 2010-08-15 18:00:00     Square          8
10: SW13 2010-08-15 18:52:00       <NA>         NA

另请参阅:How to do a data.table rolling join?

【讨论】:

如果它有效,您可以投票并选择它作为解决方案。【参考方案2】:

我想你是。问题是在 data.frames 中,日期/时间保存为字符。

apply(df1, 2, class) 
          ID unique_posix 
>  "character"  "character" 

apply(df2, 2, class)
             ID Date.Time.Start   Date.Time.End           Shape           Depth 
    "character"     "character"     "character"     "character"     "character" 

实际上,您希望将unique_posixDate.Time.StartDate.Time.End 转换为日期/时间。可能使用strptime()?我认为比较会起作用,但我还没有验证它们。我需要尽快去,但我还是想给你一些东西。

【讨论】:

对不起,我之前没有指定,我确实先转换为日期和时间!我已经在上面添加了该代码!【参考方案3】:

如果你仍然想追求 dplyr 解决方案,试试这个:

inner_join(df1, df2, by = "ID") %>%
  rowwise() %>%
  filter (between(unique_posix, Date.Time.Start, Date.Time.End)) %>%
  right_join(df1, by = c("ID", "unique_posix")) %>%
  dplyr::select (-c(Date.Time.Start, Date.Time.End), Dive.Shape = Shape, Dive.Depth = Depth)

【讨论】:

我在尝试运行时遇到一个奇怪的错误:Joining, by = c("ID", "unique_posix", "Lon", "Lat", "lc", "Bottom .Depth”、“cgoa_bathy”、“pacific_GE”)(函数(类、fdef、mtable)中的错误:无法为签名“tbl_df”的函数“select”找到继承的方法另外:警告消息:1:列ID 加入不同级别的因子,强制转换为字符向量 这可能与我的数据框中有其他列在我的示例中没有使用的事实有关,所以我会看看它是否有效我减少数据框... 我明白了 - 我没有意识到还有其他变量。我可以通过 ID 和 unique_posix 更新我的答案以明确正确加入。还应该逐行添加,并为您的错误添加 dplyr for select(可能是另一个带有 select 的包)。对此感到抱歉。

当一个数据框中只有一些日期存在于其他数据框中的其他两个日期之间时,如何连接两个数据框?

】当一个数据框中只有一些日期存在于其他数据框中的其他两个日期之间时,如何连接两个数据框?【英文标题】:Howtojointwodataframeswhenonlysomedatesinonedataframeispresentbetweentwootherdatesinotherdataframe?【发布时间】:2022-01-2222:07:48【问题... 查看详情

在pyspark数据框中的两个日期之间生成每月时间戳

】在pyspark数据框中的两个日期之间生成每月时间戳【英文标题】:Generatingmonthlytimestampsbetweentwodatesinpysparkdataframe【发布时间】:2018-09-1919:03:10【问题描述】:我有一些带有"date"列的DataFrame,我正在尝试生成一个新的DataFra... 查看详情

检查当前日期是不是在两个日期之间 Oracle SQL

】检查当前日期是不是在两个日期之间OracleSQL【英文标题】:CheckifcurrentdateisbetweentwodatesOracleSQL检查当前日期是否在两个日期之间OracleSQL【发布时间】:2014-06-1709:30:31【问题描述】:如果当前日期在OracleSQL的两个日期之间,我想... 查看详情

如何检查今天是不是在 Twig 的两个日期之间?

】如何检查今天是不是在Twig的两个日期之间?【英文标题】:howtocheckiftodayisbetweentwodatesinTwig?如何检查今天是否在Twig的两个日期之间?【发布时间】:2017-05-1101:37:35【问题描述】:我想检查今天的日期是否介于数据库中的两个... 查看详情

需要 mongodb 查询来检查日期是不是在存储在集合文档中的两个日期之间[重复]

】需要mongodb查询来检查日期是不是在存储在集合文档中的两个日期之间[重复]【英文标题】:NeededmongodbquerytocheckwhetherdateisbetweentwoDatesstoredincollectiondocument[duplicate]需要mongodb查询来检查日期是否在存储在集合文档中的两个日期之... 查看详情

如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行

】如果日期介于第二个数据帧中的两个日期之间,则r标记第一个数据帧中的行【英文标题】:rflagrowsin1stdataframeifthedateisbetweentwodatesinseconddataframe【发布时间】:2021-11-2513:02:37【问题描述】:我有两个数据集。第一个数据集对于... 查看详情

检查日期是不是在 sql 中的日期范围之间(不检查年份)

】检查日期是不是在sql中的日期范围之间(不检查年份)【英文标题】:checkifdatesarebetweendaterangeinsql(checkwithoutyear)检查日期是否在sql中的日期范围之间(不检查年份)【发布时间】:2012-05-1505:35:29【问题描述】:我正在开发一个... 查看详情

如果一个日期包含 null,则在两个日期之间选择

...2021-11-3009:26:54【问题描述】:各位好心人!我希望此查询检查两个日期之间是否有房间(朗姆酒,瑞典语)。但是,我希望查询首先检查房间是否已签出,否则使用fDatumANDtDatum。如果房间已签出,则应使用fDatum和checkUt。在数据... 查看详情

查找大型数据集中的两个日期之间是不是有假期?

】查找大型数据集中的两个日期之间是不是有假期?【英文标题】:Findifthereisanyholidaysbetweentwodatesinalargedataset?查找大型数据集中的两个日期之间是否有假期?【发布时间】:2019-07-0723:26:08【问题描述】:我正在处理一个包含大... 查看详情

查找表中的任何日期是不是在两个日期之间

】查找表中的任何日期是不是在两个日期之间【英文标题】:FindingifAnydateinatableisbetween2dates查找表中的任何日期是否在两个日期之间【发布时间】:2021-06-0716:14:03【问题描述】:我有一个SQL查询,我需要找出与特定客户相关的表... 查看详情

python - pandas - 检查数据框中是不是存在日期

】python-pandas-检查数据框中是不是存在日期【英文标题】:python-pandas-checkifdateexistsindataframepython-pandas-检查数据框中是否存在日期【发布时间】:2017-02-1501:07:30【问题描述】:我有一个这样的数据框:categorydatenumber0Cat12010-03-0111Cat... 查看详情

Hive Query - 如何比较一个表中的日期以查看它是不是在另一个表的开始和停止时间戳之间?

】HiveQuery-如何比较一个表中的日期以查看它是不是在另一个表的开始和停止时间戳之间?【英文标题】:HiveQuery-Howtocompareadatefromonetabletoseeifitsinbetweenstartandstoptimestampfromanothertable?HiveQuery-如何比较一个表中的日期以查看它是否在... 查看详情

访问 VBA 检查两个日期字段之间的时间段是不是不跨越特定日期

】访问VBA检查两个日期字段之间的时间段是不是不跨越特定日期【英文标题】:AccessVBAcheckthatperiodbetweentwodatefieldsdoesnotcrossspecificdate访问VBA检查两个日期字段之间的时间段是否不跨越特定日期【发布时间】:2016-05-2705:06:18【问题... 查看详情

如何基于相同的 ID 比较两个不同数据框中的日期列

...每一行并选择col1(id)和col2。然后,它将获取ID并遍历df2并检查该行是否具有相同的ID,然后将df1中的日期列与df2中 查看详情

从 R 中的两个数据框中选择参考日期之后的最近日期

】从R中的两个数据框中选择参考日期之后的最近日期【英文标题】:SelectthemostrecentdateafterthereferencedatefromtwodataframesinR【发布时间】:2020-05-2307:13:38【问题描述】:我正在使用R,我有两个数据集,一个包含参考日期(癌症诊断日... 查看详情

在插入 SQLite 之前检查表 B 中的日期是不是介于表 A 中的日期之间

】在插入SQLite之前检查表B中的日期是不是介于表A中的日期之间【英文标题】:CheckingifdateintableBisbetweendateinTableAbeforeinsertingSQLite在插入SQLite之前检查表B中的日期是否介于表A中的日期之间【发布时间】:2021-12-3012:41:42【问题描述... 查看详情

在两列上创建索引以检查日期是不是介于这两个列之间

】在两列上创建索引以检查日期是不是介于这两个列之间【英文标题】:Creatingindexesontwocolumnstocheckifadatefallsbetweenthosetwo在两列上创建索引以检查日期是否介于这两个列之间【发布时间】:2016-09-0320:04:13【问题描述】:我正在使... 查看详情

检查两个日期间隔是不是相交

】检查两个日期间隔是不是相交【英文标题】:Checkiftwodateintervalsintersect检查两个日期间隔是否相交【发布时间】:2013-09-0811:47:45【问题描述】:我需要检查MySQL以查看两个日期间隔是否相交。为了更好地解释我的问题:我有一... 查看详情