首页 > 解决方案 > 通过比较第二个数据框中的日期字段记录来更新数据框并仅附加新记录

问题描述

我想比较两个数据帧的日期字段,并只添加第二个数据帧的最新记录。第一个数据帧有最新的记录。这些记录每天从网站更新。第二个从我前一天保存的 csv 文件中读取记录。

我从网上读到的数据:

df_new<-structure(list(DCounter = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
   CCounter = c(125L, 36L, 22L, 17L, 11L, 8L, 4L, 20L, 8L, 3L), 
   RCounter = c(24L, 33L, 34L, 50L, 33L, 21L, 62L, 10L, 20L, 31L), 
   CrCounter = c(1L, 1L, 8L, 2L, 2L, 8L, 2L, 3L, 0L, 1L), 
   Date = c("20/03/2020", "19/03/2020", "18/03/2020", "17/03/2020", "16/03/2020", "15/03/2020", "14/03/2020", "13/03/2020", "12/03/2020","11/03/2020")), 
   class = "data.frame", row.names = c(NA, 10L))

将日期字段格式化为日期类型并重命名字段

df_new$Date = as.Date(df_new$Date, format = "%d/%m/%y")
colnames(df_new)<-c("D","C","R","Cr","Date")

#old data- read from csv file has data from yesterday
#----------------------
#df_old <- read.csv("df_Saved.csv",header=T)

df_old<-structure(list(D = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
   C = c(6L, 12L, 7L, 11L, 8L, 4L, 20L, 8L, 3L, 4L, 1L, 3L, 3L, 0L, 2L, 0L, 0L, 10L, 1L, 0L, 2L, 17L, 15L, 6L, 5L), 
   R = c(3L,3L, 0L, 3L, 2L, 2L, 0L, 0L, 3L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
   Cr = c(1L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
   Date = structure(c(17L, 16L, 15L, 14L, 13L, 12L, 11L, 10L, 9L, 8L, 25L, 24L, 23L, 22L, 21L, 20L, 19L, 18L, 7L, 6L, 5L, 4L, 3L, 2L, 1L), 
   .Label = c("2/24/2020", "2/25/2020", "2/26/2020", "2/27/2020", 
"2/28/2020", "2/29/2020", "3/1/2020", "3/10/2020", "3/11/2020", "3/12/2020",
 "3/13/2020", "3/14/2020", "3/15/2020", "3/16/20", "3/17/20", "3/18/20",
 "3/19/20", "3/2/2020", "3/3/2020", "3/4/2020", "3/5/2020", "3/6/2020", "3/7/2020", "3/8/2020", "3/9/2020"), class = "factor")), 
class = "data.frame", row.names = c(NA, -25L))

获取今天的日期并格式化

#--------------

dateToAdd<-format(Sys.time(), "%Y/%m/%d")

#extract ONLY updated dates
df_newExtracted<- with(df_new, df_new[(Date >= dateToAdd), ])
  if(df_old$Date[1]< df_newExtracted$Date[1] ){
      df_final<-rbind(df_newExtracted,df_old)
      cat("Add New records\n")  

}else{
     df_final<-df_old
     cat("Nothing new \n")  
}

df_final

write.csv(df_final, "df_Saved.csv", row.names=FALSE)

我无法找出问题的根本原因,有时如果日期相差一天,它会起作用,有时如果相差 2 天,它就不起作用。有时,如果df_newExtracted表示站点尚未更新的日期,例如:如果我们运行代码今天的日期并且他们仍然没有更新他们的记录,则该变量将为空并导致所有计算崩溃。

有人提出与写入 csv 文件和读取 csv 相关的问题,这会改变格式并使文件不稳定,我应该使用lubridate,这就是我添加格式化行的原因。有什么建议吗?

标签: rcsvdataframelubridate

解决方案


推荐阅读