创建一个循环以将滚动日期周期转换为as.Date

时间:2016-09-29 23:01:07

标签: r time-series tidyr data-cleaning as.date

我是R的新手,但是我一直在遵循一个非常好的指南来帮助他们。

我导入了过去36个月的销售数据,使用tidyr将Date列移动到行,然后将Date字符串清除为Month Date,Year。

我的问题是:我需要每个月更新一次这个文件,并且会有一个新的,滚动的36个月。我为自动化新时期而创建的功能是否有所改进(例如,当前36个月期间从2013年9月1日开始,下一个36个月期间从2013年10月1日开始等)。

关于如何在不必剪切和粘贴的情况下执行此操作的任何想法?

以下是我的代码

# import rolling periods
rolling <- read.csv("h:/R/BI with R/Rolling Periods.csv", header=T)

# remove last four columns
rolling <- rolling[,-c(42:45)]

# gather columns to rows with tidyr
require(tidyr)
rolling <- gather(rolling, "Date", "CSE", 6:41)

head(rolling)

# list from Date column
unique(rolling$Date)

# clean Date variable
clean = function(col) {
  col = gsub('X1.Month.9.1.2013.thru.9.30.2013..Case.Equivs', 'September 1, 2013', col, fixed = TRUE)
  col = gsub('X1.Month.10.1.2013.thru.10.31.2013..Case.Equivs', 'October 1, 2013', col, fixed = TRUE)
  col = gsub('X1.Month.11.1.2013.thru.11.30.2013..Case.Equivs', 'November 1, 2013', col, fixed = TRUE)
  col = gsub('X1.Month.12.1.2013.thru.12.31.2013..Case.Equivs', 'December 1, 2013', col, fixed = TRUE)
  col = gsub('X1.Month.1.1.2014.thru.1.31.2014..Case.Equivs', 'January 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.2.1.2014.thru.2.28.2014..Case.Equivs', 'February 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.3.1.2014.thru.3.31.2014..Case.Equivs', 'March 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.4.1.2014.thru.4.30.2014..Case.Equivs', 'April 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.5.1.2014.thru.5.31.2014..Case.Equivs', 'May 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.6.1.2014.thru.6.30.2014..Case.Equivs', 'June 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.7.1.2014.thru.7.31.2014..Case.Equivs', 'July 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.8.1.2014.thru.8.31.2014..Case.Equivs', 'August 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.9.1.2014.thru.9.30.2014..Case.Equivs', 'September 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.10.1.2014.thru.10.31.2014..Case.Equivs', 'October 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.11.1.2014.thru.11.30.2014..Case.Equivs', 'November 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.12.1.2014.thru.12.31.2014..Case.Equivs', 'December 1, 2014', col, fixed = TRUE)
  col = gsub('X1.Month.1.1.2015.thru.1.31.2015..Case.Equivs', 'January 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.2.1.2015.thru.2.28.2015..Case.Equivs', 'February 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.3.1.2015.thru.3.31.2015..Case.Equivs', 'March 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.4.1.2015.thru.4.30.2015..Case.Equivs', 'April 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.5.1.2015.thru.5.31.2015..Case.Equivs', 'May 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.6.1.2015.thru.6.30.2015..Case.Equivs', 'June 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.7.1.2015.thru.7.31.2015..Case.Equivs', 'July 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.8.1.2015.thru.8.31.2015..Case.Equivs', 'August 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.9.1.2015.thru.9.30.2015..Case.Equivs', 'September 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.10.1.2015.thru.10.31.2015..Case.Equivs', 'October 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.11.1.2015.thru.11.30.2015..Case.Equivs', 'November 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.12.1.2015.thru.12.31.2015..Case.Equivs', 'December 1, 2015', col, fixed = TRUE)
  col = gsub('X1.Month.1.1.2016.thru.1.31.2016..Case.Equivs', 'January 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.2.1.2016.thru.2.28.2016..Case.Equivs', 'February 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.3.1.2016.thru.3.31.2016..Case.Equivs', 'March 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.4.1.2016.thru.4.30.2016..Case.Equivs', 'April 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.5.1.2016.thru.5.31.2016..Case.Equivs', 'May 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.6.1.2016.thru.6.30.2016..Case.Equivs', 'June 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.7.1.2016.thru.7.31.2016..Case.Equivs', 'July 1, 2016', col, fixed = TRUE)
  col = gsub('X1.Month.8.1.2016.thru.8.31.2016..Case.Equivs', 'August 1, 2016', col, fixed = TRUE)
  return(col)
}

rolling$Date = clean(rolling$Date)
head(rolling)

# convert to Date object
rolling$Date = as.Date(rolling$Date, format="%B %d, %Y")
head(rolling)

2 个答案:

答案 0 :(得分:1)

您似乎只是查看滚动日期的第一部分来确定代表日期(您要替换的日期)。 在这种情况下,当使用gsub和正则表达式

时,您可以利用替换中的反向引用
# Function might not be need now
clean  <- function(col) {
    col <- gsub("X1\\.Month\\.(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4}).thru.*","\\1 \\2 \\3", col)
}

head(rolling)

# convert to Date object
#Note the new date fomat
rolling$Date <- as.Date(rolling$Date, format="%m %d %Y")
head(rolling)

如果您还需要滚动日期的结束日期,您仍然可以使用更多反向引用来捕获结束日期。

答案 1 :(得分:1)

使用点作为字段分隔符将列转换为数据框,然后 格式使用sprintfmonth.name,如下所示:

clean2 <- function(x) {
  DF <- read.table(text = x, sep = ".")
  with(DF, sprintf("%s %d, %d", month.name[V3], V4, V5))
}

最后一句话可以写成:

with(DF, format(as.Date(paste(V5, V3, V4, sep = "-")), "%B %e, %Y"))

示例

例如,使用下面注释中的输入:

clean2(x)
## [1] "September 1, 2013" "October 1, 2013"   "November 1, 2013" 

注意:以下是一些可重复的示例数据:

x <- c("X1.Month.9.1.2013.thru.9.30.2013..Case.Equivs",  
       "X1.Month.10.1.2013.thru.10.31.2013..Case.Equivs", 
       "X1.Month.11.1.2013.thru.11.30.2013..Case.Equivs")