如何使用R将不规则时间转换为XTS对象
我有下面的如何使用R将不规则时间转换为XTS对象,r,time,xts,R,Time,Xts,我有下面的data.frame,我想把它转换成xts()对象,但我一直在绞尽脑汁想如何格式化时间: 数据从最新(顶部)到最旧(底部)排列。问题是,每一行的格式都不一致,所以我很难将其格式化为每一行都显示正确的日期和时间 日期/时间列的所需输出: 01/05/17 02:55 PM 01/05/17 11:40 AM 01/05/17 07:00 AM 12/30/16 05:50 PM 12/29/16 07:03 AM 12/30/16 07:00 AM 数据: data假设您所需日期时间
data.frame
,我想把它转换成xts()
对象,但我一直在绞尽脑汁想如何格式化时间:
数据从最新(顶部)到最旧(底部)排列。问题是,每一行的格式都不一致,所以我很难将其格式化为每一行都显示正确的日期和时间
日期/时间列的所需输出:
01/05/17 02:55 PM
01/05/17 11:40 AM
01/05/17 07:00 AM
12/30/16 05:50 PM
12/29/16 07:03 AM
12/30/16 07:00 AM
数据:
data假设您所需日期时间输出的最后一行中有一个输入错误,我猜您的意思是12/29/16 07:00 AM
,那么当您在date
列中有一个元素缺少日期时,取最近已知的日期并“向后”滚动:
库(stringr)
l_datetime假设您所需的日期时间输出的最后一行中有一个输入错误,我猜您的意思是12/29/16 07:00 AM
,那么当您在date
列中有一个元素缺少日期时,取最近已知的日期并“向后”滚动:
库(stringr)
l_datetime使用sub
将Date
开头的数字替换为NA
后跟空格的数字。在此基础上,使用read.table
创建一个两列数据框,其中日期(或NA
)在第1列,时间在第2列。使用NA.locf
givingDF2
填写NA
值。现在cbind
DF2
和data[-1]
读取使用read.zoo
创建的data.frame。最后将生成的“zoo”
对象转换为“xts”
DF2使用sub
将Date
开头的数字替换为NA
后跟空格的数字。在此基础上,使用read.table
创建一个两列数据框,其中日期(或NA
)在第1列,时间在第2列。使用NA.locf
givingDF2
填写NA
值。现在cbind
DF2
和data[-1]
读取使用read.zoo
创建的data.frame。最后将生成的“zoo”
对象转换为“xts”
DF2这里有一个使用tidyquant
包的解决方案,它加载解决此问题所需的所有包。与其他解决方案一样,您需要具有结构一致的日期,例如:
"Jan-05-17 02:55 PM"
使用lubridate
包,您可以使用mdy_hm()
函数将其转换为POSIXct
类,如下所示:
"Jan-05-17 02:55 PM" %>% lubridate::mdy_hm()
> "2017-01-05 14:55:00 UTC"
其中,lubridate::mdy_hm()
函数表示月-日-年-小时-分钟。输出是正确的日期时间
类中的日期
tidyquant
包有一个方便的函数,as_xts()
,带有一个参数,date\u col
,当指定时,该参数将data.frame date列转换为xts行名称。我使用管道(%%>%%
)使代码更具可读性并显示工作流,以及dplyr::mutate()
函数,该函数使用lubridate::mdy_hm()
函数将Date
列更改为POSIXct
类。最终的工作流如下所示:
data %>%
mutate(Date = lubridate::mdy_hm(Date)) %>%
as_xts(date_col = Date)
在尝试代码片段之前,请确保Date列中的所有行的格式都有效,例如“Jan-05-17 02:55 PM”,否则您将在lubridate::mdy_hm()
函数中遇到解析错误
我用来测试的数据如下:
data <- structure(list(Date = c("Jan-05-17 02:55 PM", "Jan-05-17 11:40 AM", "Jan-05-17 07:00 AM",
"Dec-30-16 05:50 PM", "Dec-29-16 07:03 AM", "Dec-29-16 07:00 AM"), News = c("ENTEROMEDICS INC Files SEC form 8-K, Other Events, Financial Statements and Exhibits +89.95%",
"Why These 5 Biopharma Stocks Are Making Massive Gains on Thursday",
"EnteroMedics Announces vBloc® Neurometabolic Therapy Now Available at MedStar Health and Roper St. Francis PR Newswire",
"Why U.S. Steel, EnteroMedics, and McEwen Mining Slumped Today at Motley Fool -18.03%",
"Splits Calendar: EnteroMedics splits before market open today (70:1 ratio)",
"EnteroMedics Announces Retirement of All Senior Convertible Notes PR Newswire"
), Symbol = c("ETRM", "ETRM", "ETRM", "ETRM", "ETRM", "ETRM")), .Names = c("Date",
"News", "Symbol"), row.names = c(NA, 6L), class = "data.frame")
data这里有一个使用tidyquant
包的解决方案,它加载解决此问题所需的所有包。与其他解决方案一样,您需要具有结构一致的日期,例如:
"Jan-05-17 02:55 PM"
使用lubridate
包,您可以使用mdy_hm()
函数将其转换为POSIXct
类,如下所示:
"Jan-05-17 02:55 PM" %>% lubridate::mdy_hm()
> "2017-01-05 14:55:00 UTC"
其中,lubridate::mdy_hm()
函数表示月-日-年-小时-分钟。输出是正确的日期时间
类中的日期
tidyquant
包有一个方便的函数,as_xts()
,带有一个参数,date\u col
,当指定时,该参数将data.frame date列转换为xts行名称。我使用管道(%%>%%
)使代码更具可读性并显示工作流,以及dplyr::mutate()
函数,该函数使用lubridate::mdy_hm()
函数将Date
列更改为POSIXct
类。最终的工作流如下所示:
data %>%
mutate(Date = lubridate::mdy_hm(Date)) %>%
as_xts(date_col = Date)
在尝试代码片段之前,请确保Date列中的所有行的格式都有效,例如“Jan-05-17 02:55 PM”,否则您将在lubridate::mdy_hm()
函数中遇到解析错误
我用来测试的数据如下:
data <- structure(list(Date = c("Jan-05-17 02:55 PM", "Jan-05-17 11:40 AM", "Jan-05-17 07:00 AM",
"Dec-30-16 05:50 PM", "Dec-29-16 07:03 AM", "Dec-29-16 07:00 AM"), News = c("ENTEROMEDICS INC Files SEC form 8-K, Other Events, Financial Statements and Exhibits +89.95%",
"Why These 5 Biopharma Stocks Are Making Massive Gains on Thursday",
"EnteroMedics Announces vBloc® Neurometabolic Therapy Now Available at MedStar Health and Roper St. Francis PR Newswire",
"Why U.S. Steel, EnteroMedics, and McEwen Mining Slumped Today at Motley Fool -18.03%",
"Splits Calendar: EnteroMedics splits before market open today (70:1 ratio)",
"EnteroMedics Announces Retirement of All Senior Convertible Notes PR Newswire"
), Symbol = c("ETRM", "ETRM", "ETRM", "ETRM", "ETRM", "ETRM")), .Names = c("Date",
"News", "Symbol"), row.names = c(NA, 6L), class = "data.frame")
数据