【问题标题】:Calculate the difference between dates in two data frames计算两个数据框中日期之间的差异
【发布时间】:2017-07-17 14:41:17
【问题描述】:

下面是第一个数据框

Account reference number    Amount  Date
A   1   1583.51 16/05/2016
B   2   4038.18 27/09/2016
C   3   1161.36 20/05/2016
C   4   732.39  24/10/2016
C   5   747.69  24/11/2016

下面是第二个数据框

Account reference number    Amount  Date
A   6   3062.88 03/05/2016
A   7   2619.09 03/05/2016
A   8   4743.22 09/05/2016
B   9   115.28  03/05/2016
B   10  993.14  03/05/2016
B   11  879.05  03/05/2016
C   12  50.93   03/05/2016
C   13  21.83   03/05/2016
C   14  14.55   03/05/2016

我想通过比较两个数据框来找出每个帐户的日期差异。 例如,如果您比较帐户“A”的数据框中的日期,则应为 -13 天,因为开始日期为 16/05/2016,停止日期为 03/05/2016。

我希望将第一个数据框中的日期与该帐户的第二个数据框中的每个日期进行检查。例如,16/05/2016 应与 03/05/2016 和 09/05/2016 核对。

【问题讨论】:

  • 你试过合并和减去吗?
  • Account C 的情况会怎样?您在第一个数据框中有 3 个日期,在第二个数据框中有 3 个日期......总共有 9 个比较吗?
  • 你会提供你想要的输出吗?
  • 谢谢马苏德。请看下面的输出。 A 1 -13 天 A 7 -13 天 A 8 -7 天 B 9 -147 天 B 10 -147 天 B 11 -147 天
  • @user8320197 看起来您在下面收到了很多答案。如果他们中的任何一个解决了您的问题,请考虑通过单击左侧的复选标记来接受它作为答案。这让社区知道答案可以帮助您解决问题。

标签: r dataframe


【解决方案1】:

创建了我自己的示例数据,因为您的数据很难复制。基于dplyr的解决方案:

df1 = data.frame(account=c(1,2,3,4),date=seq(Sys.Date(),Sys.Date()+3,by=1),value = c(1,1,1,1))
df2 = data.frame(account=c(1,2,3,4),date=seq(Sys.Date()+2,Sys.Date()+5,by=1), value = c(2,2,2,2))

require(dplyr)

df2 = df2 %>% select(account,df2.date=date)
df1 = df1 %>% left_join(df2) %>% mutate(diff = as.numeric(date-df2.date))

输入

> df1
  account       date value
1       1 2017-07-17     1
2       2 2017-07-18     1
3       3 2017-07-19     1
4       4 2017-07-20     1
> df2
  account       date value
1       1 2017-07-19     2
2       2 2017-07-20     2
3       3 2017-07-21     2
4       4 2017-07-22     2

输出

> df1
  account       date value   df2.date diff
1       1 2017-07-17     1 2017-07-19   -2
2       2 2017-07-18     1 2017-07-20   -2
3       3 2017-07-19     1 2017-07-21   -2
4       4 2017-07-20     1 2017-07-22   -2

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    为简单起见,我假设第一个日期框架称为 a,第二个称为 b。 我以缩写形式创建了它们

    a <- data.frame(Account = c("A,B"), reference_number = c(1,2), Amount = c(1583.51,4038.18),  Date = c("16/05/2016","27/09/2016"))
    b <- data.frame(Account = c("A,A"), reference_number = c(6,7), Amount = c(3062.88,2619.09),  Date = c("03/05/2016","03/05/2016"))
    

    您可以通过这种方式找到两个日期之间的差异:

    #days
    difftime(strptime(b$Date[1], format = "%d/%m/%Y"),
         strptime(a$Date[1], format = "%d/%m/%Y"),units="days")
    
    #weeks
    difftime(strptime(b$Date[1], format = "%d/%m/%Y"),
         strptime(a$Date[1], format = "%d/%m/%Y"),units="weeks")
    

    【讨论】:

      【解决方案3】:

      使用基于Florian的答案的样本数据:

      df1 = data.frame(account=c("A","A","B","B"),date=seq(Sys.Date(),Sys.Date()+3,by=1),value = c(1,1,1,1))
      df2 = data.frame(account=c("A","A","A","B"),date=seq(Sys.Date()+2,Sys.Date()+5,by=1),value = c(2,2,2,2))
      

      我在每个数据框中添加了每个account 的几个实例。这对于为您自己的数据获得正确的输出很重要:

      library(dplyr)
      library(lubridate)
      full_join(df1,df2,by="account") %>%
        mutate(diff=date.x-date.y) %>%
      
        account     date.x value.x     date.y value.y    diff
      1       A 2017-07-17       1 2017-07-19       2 -2 days
      2       A 2017-07-17       1 2017-07-20       2 -3 days
      3       A 2017-07-17       1 2017-07-21       2 -4 days
      4       A 2017-07-18       1 2017-07-19       2 -1 days
      5       A 2017-07-18       1 2017-07-20       2 -2 days
      6       A 2017-07-18       1 2017-07-21       2 -3 days
      7       B 2017-07-19       1 2017-07-22       2 -3 days
      8       B 2017-07-20       1 2017-07-22       2 -2 days 
      

      【讨论】:

      • 非常感谢,但我希望将第一个数据框中的日期与该帐户的第二个数据框中的每个日期进行检查。如果您在我的问题 16/05/2016 中考虑 A,则应与 03/05/2016 和 09/05/2016 核对
      • 哦,我明白了。从您的原始帖子中不清楚。 (您应该更新您的帖子以表明这一点......)这使事情变得复杂。在Account C 的情况下会发生什么?您在第一个数据框中有 3 个日期,在第二个数据框中有 3 个日期......总共有 9 个比较吗?
      • 对于账户 C,20/05/2016 应与 03/05/2016 核对 3 次,24/10/2016 应与 03/05/2016 核对 3 次和 24/11 /2016 应与 03/05/2016 核对三次,因为我们的三笔交易日期相同
      • 我们可以使用 for 或嵌套 for 循环吗?
      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 2022-11-27
      • 2013-02-01
      • 1970-01-01
      • 2021-11-25
      • 2011-08-01
      相关资源
      最近更新 更多