将日期转换为月/年格式的时间序列

时间:2015-12-18 19:24:18

标签: r date time-series

我有一些水质样本数据。

> dput(GrowingArealog90s[1:10,])
structure(list(SampleDate = structure(c(6948, 6949, 6950, 7516, 
7517, 7782, 7783, 7784, 8092, 8106), class = "Date"), Flog90 =  c(1.51851393987789, 
1.48970743802793, 1.81243963000062, 0.273575501327576, 0.874218895695207, 
1.89762709129044, 1.44012088794774, 0.301029995663981, 1.23603370361931, 
0.301029995663981)), .Names = c("SampleDate", "Flog90"), class = c("tbl_df", 
"data.frame"), row.names = c(NA, -10L))

这些数据是按月收集的,但在25年期间错过了几个月。

我知道将日期转换为不同的格式有很多帮助,但我无法弄清楚这一点。我想创建一个只有一个月/年格式的时间序列,这样我就可以按月分解数据并运行季节性kendall等。我已经尝试了很多不同的方式将我的日期转换为我自己完全混淆的所需格式。只要它被识别为月/年,我就不关心确切的格式。

我还需要用NAs来填补缺失的月份。

我尝试以数字格式“yyyymm”上传“SampleDate”列。然后,我可以将该数据框与包含我需要的所有日期的另一个数据框合并。

GA90 <- merge(Dates, GrowingArealog90s, by.x = "Date", by.y = "Date", all.x = TRUE)

但是,当我将结果数据帧转换为时间序列时,它将无法识别12个月的频率。

 GA90ts <- as.ts(GA90, frequency(12))

> GA90ts
Time Series:
Start = 1 
End = 324 
Frequency = 1 

对此有任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

以下是zoo的使用方法。你会得到一个警告,但现在没关系。你会得到一个mon / yy系列。

series <-structure(list(SampleDate = structure(c(6948, 6949, 6950, 7516,
7517, 7782, 7783, 7784, 8092, 8106), class = "Date"), Flog90 =  c(1.51851393987789,
1.48970743802793, 1.81243963000062, 0.273575501327576, 0.874218895695207,
1.89762709129044, 1.44012088794774, 0.301029995663981, 1.23603370361931,
0.301029995663981)), .Names = c("SampleDate", "Flog90"), class = c("tbl_df",
"data.frame"), row.names = c(NA, -10L))

library(zoo)
series <-as.data.frame(series) #to drop dplyr class
series.zoo <-zoo(series[,-1,drop=FALSE],as.yearmon(series[,1]))

最佳做法是将系列文件与实际日期保持一致,并仅在实际需要进行计算时使用as.yearmonas.yearmon,或按月和年使用aggregate.zoo

以下是品味问题,但我处理了很多时间序列,我认为zoo优于tsxts。更加灵活。

现在,要填写缺失值,您必须创建日期向量。在这里,我正在使用具有实际日期的zoo对象。然后我使用na.locf,这是“最后一次观察结转”。您还可以查看na.approx

series.zoo <-zoo(series[,-1,drop=FALSE],(series[,1]))
my.seq <-seq.Date(first(series[,1,drop=FALSE]), last(series[,1,drop=FALSE]),by="month")
merged <-merge.zoo(series.zoo,zoo(,my.seq))
na.locf(merged)

<强>更新

使用聚合。

GrowingArealog90s <-structure(list(SampleDate = structure(c(6948, 6949, 6950, 7516,
7517, 7782, 7783, 7784, 8092, 8106), class = "Date"), Flog90 =  c(1.51851393987789,
1.48970743802793, 1.81243963000062, 0.273575501327576, 0.874218895695207,
1.89762709129044, 1.44012088794774, 0.301029995663981, 1.23603370361931,
0.301029995663981)), .Names = c("SampleDate", "Flog90"), class = c("tbl_df",
"data.frame"), row.names = c(NA, -10L))

library(zoo);library(xts)
GrowingArealog90s <-as.data.frame(GrowingArealog90s) #to remove dplyr format
GrowingArealog90s.zoo <-zoo(GrowingArealog90s[,-1,drop=FALSE],as.Date(GrowingArealog90s[,1]))

#First aggregate by month. I chose to get the mean per month
GrowingArealog90s.agg <-aggregate(GrowingArealog90s.zoo, as.yearmon, mean) #replace mean with last to get last reading of the month

#Then create a sequence of months and merge it
my.seq <-seq.Date(first(GrowingArealog90s[,1]), last(GrowingArealog90s[,1]),by="month")
merged <-merge.zoo(GrowingArealog90s.agg ,zoo(,as.yearmon(my.seq)))
na.locf(merged)