Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 计算给定开始日期和结束日期之间每个季度的平均价格?_R_Date_Date Range - Fatal编程技术网

R 计算给定开始日期和结束日期之间每个季度的平均价格?

R 计算给定开始日期和结束日期之间每个季度的平均价格?,r,date,date-range,R,Date,Date Range,我需要你再帮我一次,因为我自己没有得到正确的结果 我的数据看起来是这样的: product startdate enddate city cost double 1 1999-01-03 2001-02-01 Boston 8 0 2 2000-07-06 2001-11-24 New York 10,5 0 ... City 2011 Q1 2011 Q2 2011 Q3 New York

我需要你再帮我一次,因为我自己没有得到正确的结果

我的数据看起来是这样的:

product startdate    enddate     city     cost   double
  1    1999-01-03  2001-02-01   Boston      8       0
  2    2000-07-06  2001-11-24   New York   10,5     0
...
City       2011 Q1 2011 Q2 2011 Q3
New York     10     11,2    11,7
Boston       9       9,5    9,9
我想要的是一张表格,上面显示的是平均成本除以城市和季度

到目前为止我所做的:

df <- read_csv2("mydata.csv")

#subset data
double <- df$double
df2 <- subset(df,double==0)


#date class
startdate <- strptime(df2$startdate,format="%Y-%m-%d")

library(zoo)
quarter <- as.yearqtr(startdate,"%Y-%m-%d")


table <- tapply(cost,list(df2$city,quarter),mean)
我的问题是我有一个开始日期和结束日期。表中显示了取决于起始日期的季度数。 我现在想得到相同的表,但季度应该包括结束日期。这意味着:如果开始日期是2006-01-01,结束日期是2006-08-01,那么我的项目在2006年第一季度、2006年第二季度、2006年第三季度上线。 我的商品的价格在整个时间内都是相同的,但是当我计算每个季度的平均价格时,价格应该包含在产品在线的每个季度中

我所做的是更改enddate的类:

#enddate , date class
today <- Sys.Date()
df2[["enddate"]][is.na(df2[["enddate"]])] <- today
enddate <- strptime(df2$enddate,format="%Y-%m-%d")
#结束日期,日期类

今天一个策略是用财政年度季度的附加信息(即列)以长格式扩展表。然后,可以使用数据透视按所需方式进行汇总

要获取年度和季度,请使用以下函数

getQuarter <- function(x, first=0, prefix="Q") {
  # x:      Date object 
  # first:  Jan is 0
  # prefix: Affix symbol for quarter, default 'Q' 
  d <- as.POSIXlt(x);
  q <- floor((d$mon-first+1)/3.03)
  q <- paste0(d$year+1900,'-',prefix,q+1, collapse="")
  q
}
现在把它放在一起,得到两个日期之间的所有季度

unique(getQuarterV(getSeries(start, end)))   # "2016-Q1" "2016-Q2" "2016-Q3"

现在,您可以继续将此数据与原始数据集成,并提取所需的摘要。

您的完整解决方案可能如下所示。我使用了data.table

在data.table中加载数据

library(data.table)
d <- read.csv("Products.csv")
D <- as.data.table(d)
我从数据开始

Product,Date.Start,Date.End,City,Cost
Apple,1-Jan-16,1-Aug-16,Bangalore,150
Tomato,1-Dec-15,15-Jan-16,Pune,30
Apple,1-Nov-15,1-Jun-16,Bangalore,155
Tomato,1-Jun-16,1-Dec-16,Bangalore,45
Tomato,1-Oct-16,1-Nov-16,Pune,15

非常感谢你的回答,帮助我理解了我需要做的事情。不幸的是,我在使用seq函数时出错。我所做的是将日期列格式化为日期对象。当我要执行下一步时:Tim,您是否对
getSeries()
函数进行了矢量化以获得
getSeriesV()
函数?通过
getSeriesV My bad,Work out perfect来实现这一点!在执行下一步时仍然有问题:de str(de)类“tbl_df”、“tbl”和“data.frame”:4036 obs。183个变量中:$city:chr-NA-NA-NA…$enddate:Date,格式:NA…$startdate:Date,format:NA-NA…我已经在github上发布了我的示例代码:。数据位于文件“Products.csv”中。请看看这是否有帮助。干杯你能检查一下
名称
重复
中的内容吗?这些向量应该是相同长度的向量。其思想是将数据表扩展为长格式,使用行名称按日期跨越的季度数重复行。
getSeries(start, end)     # "2016-01-01" "2016-04-01" "2016-07-01" ..
getSeries(start, start)   # "2016-01-01"
unique(getQuarterV(getSeries(start, end)))   # "2016-Q1" "2016-Q2" "2016-Q3"
library(data.table)
d <- read.csv("Products.csv")
D <- as.data.table(d)
# Condition data
#   Format date columns to Date objects
D[, ':=' (Date.Start = as.Date(Date.Start, format="%d-%b-%y"),
  Date.End = as.Date(Date.End, format="%d-%b-%y"))][]
#   Compute the no. of quarters from start, end dates
#     Use:
#       getSeriesV() for dates every quarter given start and end dates
#       getQuarterV() for the fiscal quarter given a date
Quarters <- D[, .(getSeriesV(Date.Start, Date.End))]
Quarters <- lapply(Quarters$V1, function(x) unique(getQuarterV(x)))
Repeats <- sapply(Quarters, length)
Names <- D[, rownames(.SD)]
de <-  d[rep(Names, Repeats),]
De <- as.data.table(de)
De[, ':=' (Date.Start = as.Date(Date.Start, format="%d-%b-%y"),
           Date.End = as.Date(Date.End, format="%d-%b-%y"))][]
De[, Quarters := unlist(Quarters)]
De[, .(Avg = mean(Cost)), by=c('Product', 'City', 'Quarters')]
Product,Date.Start,Date.End,City,Cost
Apple,1-Jan-16,1-Aug-16,Bangalore,150
Tomato,1-Dec-15,15-Jan-16,Pune,30
Apple,1-Nov-15,1-Jun-16,Bangalore,155
Tomato,1-Jun-16,1-Dec-16,Bangalore,45
Tomato,1-Oct-16,1-Nov-16,Pune,15