如何使用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
giving
DF2
填写
NA
值。现在
cbind
DF2
data[-1]
读取使用
read.zoo
创建的data.frame。最后将生成的
“zoo”
对象转换为
“xts”


DF2使用
sub
Date
开头的数字替换为
NA
后跟空格的数字。在此基础上,使用
read.table
创建一个两列数据框,其中日期(或
NA
)在第1列,时间在第2列。使用
NA.locf
giving
DF2
填写
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")
数据