首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将每月时间序列转换为每日时间序列

将每月时间序列转换为每日时间序列
EN

Stack Overflow用户
提问于 2018-01-15 16:07:18
回答 2查看 1.2K关注 0票数 1

我使用的是一个每月的时间序列数据,它实际上是一个xts对象。我的目标是将每月数据转换为每日数据,这样一个月中的每一天都具有特定月份的值。

例如:

代码语言:javascript
复制
library("xts")
observation_dates <- as.Date(c("01.12.1993", "01.01.1994",
"01.02.1994", "01.03.1994", "01.04.1994", "01.05.1994", 
"01.06.1994", "01.07.1994", "01.08.1994", "01.09.1994", 
"01.10.1994", "01.11.1994", "01.12.1994"), format = "%d.%m.%Y")
air_data <- zoo(matrix(c(21, 21, 21, 30, 35.5, 36, 38.5, 
33, 37, 37, 30, 24, 21), ncol = 1), observation_dates)
colnames(air_data) = "air_temperature"

该系列如上图所示。我希望1993年12月的所有31天的值为21 (空气温度),因此该月的平均值仍为21。类似地,我想在接下来的几个月中继续进行,如下所示。

我尝试过使用to.period(x, period="days"),但没有任何变化。

有谁知道吗?您的帮助将不胜感激

EN

回答 2

Stack Overflow用户

发布于 2018-01-16 02:06:46

非常感谢您的回复。然而,我能够解决这个问题。我使用的方法与Ekatef建议的方法类似。在我的示例中,我创建了包含所有日期的空xts对象,并使用lapply()将空xts中的所有变量转换为数字。然后,我使用merge(x,y,fill=na.locf)将空的xts与每月数据序列合并。在这里,na.locf将每月序列中的最后一个观察值结转到该月的所有日期,并随后跟踪另一个月。

票数 1
EN

Stack Overflow用户

发布于 2018-01-15 19:26:44

根据to.period的帮助,xts包不适用于您的问题

不可能将序列从较低的周期性转换为较高的周期性-例如,每周到每日或每天到5分钟小节,因为这将需要魔法

如果需要插值,approx()函数似乎是最好的解决方案

代码语言:javascript
复制
# emulation of the original monthly dates
observation_dates <- as.Date(c("01.12.1993", "01.01.1994", 
"01.02.1994", "01.03.1994", "01.04.1994", "01.05.1994", 
"01.06.1994", "01.07.1994", "01.08.1994", "01.09.1994", 
"01.10.1994", "01.11.1994", "01.12.1994"), format = "%d.%m.%Y")
t_air <- c(21, 23, 20, 30, 35.5, 36, 38.5, 33, 37, 37, 30, 24, 27)
# target dates
seq_date <- seq(from = as.Date("01.12.1993", format = "%d.%m.%Y"),
to = as.Date("31.12.1994", format = "%d.%m.%Y"), by = 1)
ans <- approx(observation_dates, y = t_air, xout = seq_date)

如果每个月只使用一个值,我会使用两个数据框来解决您的问题。第一个obs_data以方便的“年-月”格式保存观察数据和日期列

代码语言:javascript
复制
ym_dates <- format(observation_dates, "%Y-%m")
t_air <- c(21, 23, 20, 30, 35.5, 36, 38.5, 33, 37, 37, 30, 24, 27)
obs_data <- data.frame(observation_dates, ym_dates ,t_air)

第二个res_df保持每日分辨率的目标日期seq_date。列air_t首先用NA填充

代码语言:javascript
复制
res_df <- data.frame(seq_date, ym = format(seq_date, "%Y-%m"),
    stringsAsFactors = FALSE, air_t = NA)

然后,使用年份和月份的对应关系作为条件,用obs_data中的数据填充air_t

代码语言:javascript
复制
dates_to_int <- unique(res_df$ym)
for (i in seq(along.with = dates_to_int))
{
    res_df[which(res_df$ym %in% dates_to_int[i]), "air_t"] <-
        obs_data[which(obs_data$ym_dates %in% dates_to_int[i]), "t_air"]
    }

希望,这将是有用的:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48259016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档