Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将零需求月数添加到zoo时间序列中_R_Time Series_Zoo_Intermittent - Fatal编程技术网

R 将零需求月数添加到zoo时间序列中

R 将零需求月数添加到zoo时间序列中,r,time-series,zoo,intermittent,R,Time Series,Zoo,Intermittent,我有一些间歇性需求数据,仅包括存在需求的线路。我通过read.csv将其引入,我的两列是日期(作为日期)和数量(作为整数)。然后我将其转换为动物园系列,并将每日需求合并为每月需求。我的最终输出是一个动物园系列,日期是一个月的第一天和该月的总需求 我的问题是,这个动物园系列缺少零需求的中间月份,我需要这些数据来正确预测间歇性需求 例如:我在日期2013-01-01中有数量2,然后下一行是2013-10-01中的数量3。我需要将数量0添加到2013-02-01到2013-09-01 Date <

我有一些间歇性需求数据,仅包括存在需求的线路。我通过read.csv将其引入,我的两列是日期(作为日期)和数量(作为整数)。然后我将其转换为动物园系列,并将每日需求合并为每月需求。我的最终输出是一个动物园系列,日期是一个月的第一天和该月的总需求

我的问题是,这个动物园系列缺少零需求的中间月份,我需要这些数据来正确预测间歇性需求

例如:我在日期2013-01-01中有数量2,然后下一行是2013-10-01中的数量3。我需要将数量0添加到2013-02-01到2013-09-01

Date <- c('1/1/2013','10/1/2013','11/1/2013')
Quantity <- c('2','3','6')

Date <- as.Date(Date, "%m/%d/%Y")

df <- data.frame(Date, Quantity)
df <- read.zoo(df)
df

您可以使用
merge
添加缺少的行,然后将其值设置为零

首先,让我们创建一些假数据:

# Vector of dates from Jan 1, 2015, to Mar 31, 2015
dates = seq(as.Date("2015-01-01"), as.Date("2015-03-31"), by="1 day")

# Let's create data for few of these dates, leaving some out
set.seed(55)
dat = data.frame(dates=dates[sample(1:length(dates), 70)],
                 quantity=sample(1:10, 70, replace=TRUE))
dat = dat[order(dat$dates),]
现在让我们假设
dat
是您从csv文件导入的内容。我们要填写
数量
=0以表示缺少的日期。因此,首先我们需要为丢失的日期添加行。您可以通过在csv文件中创建一个包含从第一个日期到最后一个日期的所有日期的日期向量,并使用
merge
功能来实现这一点。在本例中,我们已经创建了上面的日期向量

现在合并缺少日期的行。对于
数量
,新行将具有
NA
。我们将把下面的
NA
s更改为零

dat = merge(data.frame(dates), dat, by="dates", all.x=TRUE)

# Set missing values to zero
dat$quantity[is.na(dat$quantity)] = 0
现在您可以按月进行聚合,转换为
zoo
系列,等等。

因为“df”是
zoo
对象,您可以使用
merge.zoo
及其
fill
参数。当前数据集与包含所有所需日期的空
zoo
对象合并

tt <- seq(min(Date), max(Date), "month")
merge(df, zoo(, tt), fill = 0)

# 2013-01-01 2013-02-01 2013-03-01 2013-04-01 2013-05-01 2013-06-01 2013-07-01 2013-08-01 2013-09-01 2013-10-01 2013-11-01 
#          2          0          0          0          0          0          0          0          0          3          6 

tt请提供,这意味着数据示例、您尝试的代码、预期输出以及任何错误消息。我将试一试。这非常有效,谢谢!我也有类似的想法,但合并不起作用。我改变了命名配置,使合并函数中的by=“dates”与两个数据帧匹配,现在我可以将所有内容都输入,转换为zoo系列,聚合为每月需求,并对每月需求执行Croston的方法。我很高兴它起到了作用,尽管我认为@Henrik的答案更好,如果你使用
zoo
对象。
tt <- seq(min(Date), max(Date), "month")
merge(df, zoo(, tt), fill = 0)

# 2013-01-01 2013-02-01 2013-03-01 2013-04-01 2013-05-01 2013-06-01 2013-07-01 2013-08-01 2013-09-01 2013-10-01 2013-11-01 
#          2          0          0          0          0          0          0          0          0          3          6