【发布时间】:2022-01-15 10:46:12
【问题描述】:
我有一个时间序列,我想将其转换为一个数据帧,其中包含包含值的列和一个包含 ttime 的 Date/POSIXct 列。可重现的例子:
data_ts <- ts(matrix(1:14, ncol= 2), start= c(2000, 1), frequency= 6)
预期输出是:
data_df <- data.frame(Series_1= 1:7, Series_2= 8:14, Date= seq(as.Date("2000/1/1"), length.out= nrow(data_ts)*2, by= "month")[seq(1, nrow(data_ts)*2, 2)])
data_df
Series_1 Series_2 Date
1 1 8 2000-01-01
2 2 9 2000-03-01
3 3 10 2000-05-01
4 4 11 2000-07-01
5 5 12 2000-09-01
6 6 13 2000-11-01
7 7 14 2001-01-01
在这个例子中,frequency 是 6 并且开始是 c(2000, 1) 但在我的用例中,我事先不知道这些参数。事实上,frequency 也可能大到我指的是小时/分钟或秒(例如frequency= 365*24*60*60)。如果频率以年/月/周/天为单位,Date 就足够了,但是对于小时/分钟/秒,该列当然必须更改(更改为 POSIXct)。所以我正在尝试一个通用的解决方案。我希望它是基础 R。
有一个similar 问题,但答案有一列日期为十进制数字。相反,我需要一个实际的 Date/PSIXct 列。
【问题讨论】:
-
如果你对 lubridate 没问题
transform(as.data.frame(data_ts), Date = as.Date(date_decimal(as.numeric(time(data_ts))))) -
@akrun 谢谢,但我的主管要求我坚持使用基础 R。
-
@G.Grothendieck 我们可以简单地将频率从 365*24*60*60 更改为 365.25*24*60*60 以处理闰年(请参阅here)。无论如何,根据上下文,Rob Hyndman 还建议使用frequency=7 来获取每日数据,在这种情况下,我的尝试没有任何意义,因为我的方法总是参考年份单位和日期。我想我必须重新提出这个问题。但是将频率限制为(多个)月不是一种选择。
-
@G.Grothendieck 是否可以使用 365.25*24*60*60 而不是 365*24*60*60 因为闰年或不是因为“ ts 仅适用于固定/常数我猜每年的积分数”是您必须与 Rob Hyndman 讨论的问题。我坚持他的描述,因为否则我看不到如何定义一年中的天/小时/分钟/秒的解决方案。是的,“如果它有一个年度频率,你不能只说它是 7”。我的意思是“根据上下文,Rob Hyndman 还建议对每日数据使用频率 = 7”。
-
我注意到这条评论 - “因为 stackoverflow.com/questions/70476759/...而删除我的帐户”。只是想告诉您,您可以使用标记将您的问题与您的帐户取消关联,从而消除负面声誉影响,因此没有理由删除您的帐户。
标签: r dataframe date time-series