如何将数据帧转换为时间序列?

时间:2015-03-14 06:54:48

标签: r time-series

我有一个csv文件,其中我有2个股票收盘价(每日)

Dates   Bajaj_close Hero_close
3/14/2013   1854.8  1669.1
3/15/2013   1850.3  1684.45
3/18/2013   1812.1  1690.5
3/19/2013   1835.9  1645.6
3/20/2013   1840    1651.15
3/21/2013   1755.3  1623.3
3/22/2013   1820.65 1659.6
3/25/2013   1802.5  1617.7
3/26/2013   1801.25 1571.85
3/28/2013   1799.55 1542

我想将上述数据转换为时间序列格式。 (开始日期为3/14/2013 结束日期是3/13/2015)我试过这个,但它给了我一些奇怪的输出

values <- bajaj_hero[, -1]  (excluded first column i.e date in real dataset)
bajaj_hero_timeseries <- ts(values,start=c(2013,1),end=c(2015,3),frequency=365)

输出是:

           Bajaj_close Hero_close
2013.000     1854.80    1669.10
2013.003     1850.30    1684.45
2013.005     1812.10    1690.50
2013.008     1835.90    1645.60
2013.011     1840.00    1651.15
2013.014     1755.30    1623.30
2013.016     1820.65    1659.60
2013.019     1802.50    1617.70
2013.022     1801.25    1571.85

请帮助..:)

5 个答案:

答案 0 :(得分:19)

R有多种表示时间序列的方法。由于您正在处理每日股票价格,您可能希望考虑金融市场在周末和商务假期关闭,以便交易日和日历日不一样。但是,您可能需要根据交易日和日历日处理您的时间序列。例如,无论周末是否介入,每日回报都是从连续的每日收盘价计算得出的。但您可能还希望进行基于日历的报告,例如每周价格摘要。由于这些原因,xts包(动物园的扩展)通常与R中的财务数据一起使用。下面是一个如何与数据一起使用的示例。

假设您的示例中显示的数据位于数据框df

  library(xts)
  stocks <- xts(df[,-1], order.by=as.Date(df[,1], "%m/%d/%Y"))
#
#  daily returns
#
   returns <- diff(stocks, arithmetic=FALSE ) - 1
#
#  weekly open, high, low, close reports
#
   to.weekly(stocks$Hero_close, name="Hero")

给出输出

           Hero.Open Hero.High Hero.Low Hero.Close
2013-03-15    1669.1   1684.45   1669.1    1684.45
2013-03-22    1690.5   1690.50   1623.3    1659.60
2013-03-28    1617.7   1617.70   1542.0    1542.00

答案 1 :(得分:15)

输入。我们将从问题中显示的输入文本开始,因为问题没有提供csv输入:

Lines <- "Dates   Bajaj_close Hero_close
3/14/2013   1854.8  1669.1
3/15/2013   1850.3  1684.45
3/18/2013   1812.1  1690.5
3/19/2013   1835.9  1645.6
3/20/2013   1840    1651.15
3/21/2013   1755.3  1623.3
3/22/2013   1820.65 1659.6
3/25/2013   1802.5  1617.7
3/26/2013   1801.25 1571.85
3/28/2013   1799.55 1542"

zoo。 "ts"类系列通常不代表日期索引,但我们可以创建一个动物园系列(见zoo package):

library(zoo)
z <- read.zoo(text = Lines, header = TRUE, format = "%m/%d/%Y")

或者,如果您已经将其读入数据框DF,那么它可以转换为动物园,如下面第二行所示:

DF <- read.table(text = Lines, header = TRUE)
z <- read.zoo(DF, format = "%m/%d/%Y")

z以上的任何一种情况下,都是一个动物园系列,其中"Date"类时间指数。还可以创建动物园系列zz,它使用1,2,3 ......作为时间索引:

zz <- z
time(zz) <- seq_along(time(zz))

ts。其中任何一个都可以转换为"ts"班级系列:

as.ts(z)
as.ts(zz)

第一个有一个时间索引,它是自大纪元(1970年1月1日)以来的天数,并且将有缺失天数的NA和第二个将有1,2,3,...作为时间索引和没有NAs。

每月系列。通常"ts"系列用于月度,季度或年度系列。因此,如果我们将输入汇总为几个月,我们可以合理地将其表示为"ts"系列:

z.m <- as.zooreg(aggregate(z, as.yearmon, mean), freq = 12)
as.ts(z.m)

答案 2 :(得分:3)

该聚会很晚,但是tsbox软件包旨在执行这种转换。要将数据转换为ts对象,您可以执行以下操作:

dta <- data.frame(
  Dates = c("3/14/2013", "3/15/2013", "3/18/2013", "3/19/2013"),
  Bajaj_close = c(1854.8, 1850.3, 1812.1, 1835.9),
  Hero_close = c(1669.1, 1684.45, 1690.5, 1645.6)
)

dta
#>       Dates Bajaj_close Hero_close
#> 1 3/14/2013      1854.8    1669.10
#> 2 3/15/2013      1850.3    1684.45
#> 3 3/18/2013      1812.1    1690.50
#> 4 3/19/2013      1835.9    1645.60

library(tsbox)
ts_ts(ts_long(dta))
#> Time Series:
#> Start = 2013.1971293045 
#> End = 2013.21081883954 
#> Frequency = 365.2425 
#>          Bajaj_close Hero_close
#> 2013.197      1854.8    1669.10
#> 2013.200      1850.3    1684.45
#> 2013.203          NA         NA
#> 2013.205          NA         NA
#> 2013.208      1812.1    1690.50
#> 2013.211      1835.9    1645.60

它会自动分析日期,检测频率并明确显示周末的缺失值。使用ts_<class>,您可以将数据转换为任何其他时间序列类。

答案 3 :(得分:1)

请参见以下问题:Converting data.frame to xts order.by requires an appropriate time-based object,它建议查看order.by的参数,

  

当前可接受的类包括:“日期”,“ POSIXct”,“时间日期”,   以及保留索引值的“ yearmon”和“ yearqtr”   

进一步建议使用order.by = as.POSIXct进行显式转换,

df$Date <- as.POSIXct(strptime(df$Date,format),tz="UTC")
xts(df[, -1], order.by=as.POSIXct(df$Date))

在其他位置分配了格式,

format <- "%m/%d/%Y" #see strptime for details

答案 4 :(得分:0)

使用库fpp,您可以轻松创建日期格式的时间序列:     time_ser=ts(data,frequency=4,start=c(1954,2))

这里我们从1954年第二季度开始,季度频率。