我有一个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
请帮助..:)
答案 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年第二季度开始,季度频率。