【问题标题】:Append new data to existing csv file in R将新数据附加到 R 中的现有 csv 文件
【发布时间】:2020-12-14 18:34:33
【问题描述】:

我正在开展一个项目,我需要绘制来自远程站点的 10 天数据。

我每 30 分钟通过 FTP 从远程计算机下载新数据(数据也是每半小时写入一次)。 本地(现场)文件路径每个月都会更改,因此我有一个基于当前日期的动态 IP 地址。

例如。

/data/sitename/2020/July/data.csv
/data/sitename/2020/August/data.csv

我的问题是,在每个新月,我下载的 csv 文件都会在一个新文件夹中,当我 FTP 新的 csv 文件时,它只会包含新月的数据,而不是前几个月的数据。

我需要绘制过去 10 天的数据。 所以我希望做的是每半小时下载一次新数据,并且只将最新的记录附加到主数据集中。还是有更好的办法?

我(想我)需要做的是将 csv 下载到 R 中,并将新数据仅附加到主文件并删除最旧的记录,以便在 csv 中仅包含 10 天的数据。 我到处搜索,但似乎无法破解它。

这似乎应该很容易,也许我使用了错误的搜索词。

我想要以下漂亮的(显示 10 行数据,我需要 480 10 天)。

初始数据

                        DateTime   Data1 Data2    Data3  Data4   Data5
641 2020-08-26T02:31:59.999+10:00 10.00      53.4 3.101   42 20.70
642 2020-08-26T03:01:59.999+10:00 11.11      52.0 2.778   44 20.70
643 2020-08-26T03:31:59.999+10:00  2.63     105.5 2.899   45 20.70
644 2020-08-26T04:01:59.999+10:00 11.11      60.5 2.920   45 20.70
645 2020-08-26T04:31:59.999+10:00  3.03     101.3 2.899   48 20.70
646 2020-08-26T05:01:59.999+10:00  2.86     125.2 2.899   49 20.65
647 2020-08-26T05:31:59.999+10:00  2.86     132.2 2.899   56 20.65
648 2020-08-26T06:01:59.999+10:00  3.23     113.9 2.963   61 20.65
649 2020-08-26T06:31:59.999+10:00  3.45     113.9 3.008   64 20.65
650 2020-08-26T07:01:59.999+10:00  3.57     108.3 3.053   66 20.65

新数据

                         DateTime   Data1 Data2    Data3  Data4   Data5
641 2020-08-26T02:31:59.999+10:00 10.00      53.4 3.101   42 20.70
642 2020-08-26T03:01:59.999+10:00 11.11      52.0 2.778   44 20.70
643 2020-08-26T03:31:59.999+10:00  2.63     105.5 2.899   45 20.70
644 2020-08-26T04:01:59.999+10:00 11.11      60.5 2.920   45 20.70
645 2020-08-26T04:31:59.999+10:00  3.03     101.3 2.899   48 20.70
646 2020-08-26T05:01:59.999+10:00  2.86     125.2 2.899   49 20.65
647 2020-08-26T05:31:59.999+10:00  2.86     132.2 2.899   56 20.65
648 2020-08-26T06:01:59.999+10:00  3.23     113.9 2.963   61 20.65
649 2020-08-26T06:31:59.999+10:00  3.45     113.9 3.008   64 20.65
650 2020-08-26T07:01:59.999+10:00  3.57     108.3 3.053   66 20.65
651 2020-08-26T07:31:59.999+10:00  3.85     109.7 3.125   70 20.65

所需数据

                         DateTime   Data1 Data2    Data3  Data4   Data5
642 2020-08-26T03:01:59.999+10:00 11.11      52.0 2.778   44 20.70
643 2020-08-26T03:31:59.999+10:00  2.63     105.5 2.899   45 20.70
644 2020-08-26T04:01:59.999+10:00 11.11      60.5 2.920   45 20.70
645 2020-08-26T04:31:59.999+10:00  3.03     101.3 2.899   48 20.70
646 2020-08-26T05:01:59.999+10:00  2.86     125.2 2.899   49 20.65
647 2020-08-26T05:31:59.999+10:00  2.86     132.2 2.899   56 20.65
648 2020-08-26T06:01:59.999+10:00  3.23     113.9 2.963   61 20.65
649 2020-08-26T06:31:59.999+10:00  3.45     113.9 3.008   64 20.65
650 2020-08-26T07:01:59.999+10:00  3.57     108.3 3.053   66 20.65
651 2020-08-26T07:31:59.999+10:00  3.85     109.7 3.125   70 20.65

这就是我所在的地方......

library(RCurl) 
library(readr)
library(ggplot2)
library(data.table) 

# Get the date parts we need
Year <-format(Sys.Date(), format="%Y")
Month <- format(Sys.Date(), format="%B")
MM <- format(Sys.Date(), format="%m")

# Create the file string and read
site <- glue::glue("ftp://user:passwd@99.99.99.99/path/{Year}/{Month}/site}{Year}-{MM}.csv")
site <- read.csv(site, header = FALSE)

# Write table and create csv
EP <- write.table(site, "EP.csv", col.names = FALSE, row.names = FALSE)
EP <- fread("EP.csv", header = FALSE, select = c( 1, 2, 3, 5, 6, 18))
output<- write.table(EP, file = 'output.csv', col.names = c("A", "B", etc), sep = ",", row.names = FALSE)
#working up to here

# Append to master csv file
master <- read.csv("C:\\path\\"master.csv")

【问题讨论】:

    标签: r csv time-series append


    【解决方案1】:

    您可以将DateTime 列转为POSIXct 类,结合新数据和初始数据,获取最近10 天的数据。

    library(dplyr)
    library(lubridate)
    
    initial_data <- initial_data %>% mutate(DateTime = ymd_hms(DateTime))
    new_data <- new_data %>% mutate(DateTime = ymd_hms(DateTime))
    combined_data <- bind_rows(new_data, initial_data)
    
    ten_days_data <- combined_data %>% 
                       filter(between(as.Date(DateTime), Sys.Date() - 10, Sys.Date()))
    

    【讨论】:

    • 您好 Ronak,感谢您的帮助。我已经尝试过你的建议,但是在组合数据集时,newwest 只是添加到第一个的底部,所有数据都重复,而不仅仅是附加的最新数据。
    • 这很奇怪。什么是 class(new_data) 和 class(initial_data)。或者代替bind_rows 尝试rbind 即combined_data &lt;- rbind(new_data, initial_data)
    • new_data 和 initial_data 都是 data.frame。我刚刚尝试使用 rbind 并得到了相同的结果。
    • ten_days_data 中存在什么?它应该有从今天到过去 10 天的 10 天的数据。
    • ten_days_data 确实只有最近 10 天的数据(存在时区问题),但由于组合数据中存在相同的数据,因此也有重复
    【解决方案2】:

    我将尝试结合 Ronak 的帮助来回答这个问题。 我仍然希望可以找到更好的解决方案,我可以简单地将新数据附加到旧数据。

    我的问题有多个部分,Ronak 为过去 10 天的问题提供了解决方案:

    ten_days_data <- combined_data %>% 
                       filter(between(as.Date(DateTime), Sys.Date() - 10, Sys.Date()))
    

    第二部分关于结合我从另一个帖子How to rbind new rows from one data frame to an existing data frame in R找到的数据

    combined_data <- unique(rbindlist(list(inital_data, new_data)), by = "DateTime")
    

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多