【问题标题】:Convert date to month/year format for time series将时间序列的日期转换为月/年格式
【发布时间】:2015-12-18 19:24:18
【问题描述】:

我有一些水质样本数据。

> 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 年期间有些月份会丢失。

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

我还需要用 NA 填写缺失的月份。

我尝试以数字格式“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 

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

【问题讨论】:

    标签: r date time-series


    【解决方案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.yearmonaggregate.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)
    

    【讨论】:

    • 感谢您的回复!当我运行“my.seq”行时,它给了我以下错误:“seq.Date 中的错误(first(GrowingArealog90s[, 1, drop = FALSE]), last(GrowingArealog90s[, : 'from' must be of length 1"。
    • 试试这个:my.seq &lt;-seq.Date(first(GrowingArealog90s[,1]), last(GrowingArealog90s[,1]),by="month")
    • 另外,确保GrowingArealog90s 不是来自dplyrtbl_df。它必须是一个data.frame。 dplyr 用于表格,而不是时间序列。
    • 再次感谢,这让我更接近我正在寻找的东西,但是它在我不想要的地方添加了 NA。我希望每个月有一条线,它添加到 NAs 中已经有几个月的值,比如下面的 1989 年 4 月。 > 头部(合并) Flog90 1989-01-05 1.3774064 1989-02-05 NA 1989-03-05 NA 1989-03-09 0.8682064 1989-04-05 NA 1989-04-06 0.9364644
    • 当然!我星期一回来。慢慢来,非常感谢!
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多