首页 > 解决方案 > 将新数据附加到 R 中的现有 csv 文件

问题描述

我正在做一个项目,我需要从远程站点绘制 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")

标签: rcsvtime-seriesappend

解决方案


您可以将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()))

推荐阅读