我有一个与此类似的时间序列数据
val
2015-10-15 7.85
2015-10-16 8
2015-10-19 8.18
2015-10-20 5.39
2015-10-21 2.38
2015-10-22 1.98
2015-10-23 9.25
2015-10-26 14.29
2015-10-27 15.52
2015-10-28 15.93
2015-10-29 15.79
2015-10-30 13.83
我如何找到 val 变量的相邻行(例如 8 和 7.85)的斜率并将其打印在 R 或 python 中的不同列中
我知道斜率的公式是
但问题是我们如何获取时间序列数据中 x(即日期)值的差异 (这里x是日期,y是val)
如果您所说的斜率是指(值(y)-值(x))/(y-x),那么您的斜率应该至少比您的数据框小一个值,因此很难在同一数据框中显示它.
在 R 中,这就是我的答案:
slope<-numeric(length = nrow(df))
for(i in 2:(nrow(df)){
slope[i-1]<-(df[i-1,"val"]-df[i,"val"])/(as.numeric(df[i-1,1]-df[i,1]))
}
slope[nrow(df)]<-NA
df$slope<-slope
在 R 中,日期是一类数据(如整数、数字或字符)。 例如,我可以定义一个日期向量:
x<-as.Date(c("2015-10-15","2015-10-16"))
print( x )
[1] "2015-10-15" "2015-10-16"
返回 2 个日期的差值:
x[2]-x[1]
Time difference of 1 days
正如您所提到的,您不能除以日期:
2/(x[2]-x[1])
Error in `/.difftime`(2, (x[2] - x[1])) :
second argument cannot be "difftime"
这就是我使用 as.numeric 的原因,它强制向量为数值(以天为单位):
2/as.numeric(x[2]-x[1])
[1] 2
证明它有效:
as.numeric(as.Date("2016-10-15")-as.Date("2015-10-16"))
[1] 365
(2016 年是六合年,这是正确的!)