带前导 X 字符的截止日期字符串

String to Date with leading X character

我正在尝试将 Date 列转换为日期格式,但我一直收到错误消息。我认为问题可能是日期是一个字符并且在年份之前有一个 X:

HMC.Close        Date
1     39.71 X2007.01.03
2     40.04 X2007.01.04
3     38.67 X2007.01.05
4     38.89 X2007.01.08
5     38.91 X2007.01.09
6     37.94 X2007.01.10

这是我用过的代码运行:

stock_honda <- expand.grid("HMC" = HMC$HMC.Close) %>%
  "Date" = as.Date(row.names(as.data.frame(HMC))) %>% 
  subset(Date >"2021-02-28" & Date < "2022-03-11")

Error in charToDate(x) : character string is not in a standard unambiguous format

您可以使用 gsub 首先删除导致问题的“X”,然后使用 lubridate 包中的 ymd 将字符串转换为日期。此外,您可以使用 dplyr 包中的 mutate(across(...)) 进行转换,以完成 tidyverse-way.

中的所有操作
library(dplyr)
library(lubridate)

df |>
  # Mutate Date to remove X and convert it to Date
  mutate(across(Date, function(x){
    ymd(gsub("X","", x))
  }))

#  HMC.Close       Date
#1     39.71 2007-01-03
#2     40.04 2007-01-04
#3     38.67 2007-01-05
#4     38.89 2007-01-08
#5     38.91 2007-01-09
#6     37.94 2007-01-10

这是一个避免首先在日期前添加“X”的管道:

library(quantmod)
getSymbols(c("FCAU.VI", "TYO", "VWAGY", "HMC"), na.rm = TRUE)

library(tidyverse)
stock_honda <- (HMC
  %>% as.data.frame()
  %>% rownames_to_column("Date")
  %>% select(Date, HMC.Close)
  %>% mutate(across(Date, lubridate::ymd))
  %>% filter(between(Date, as.Date("2021-02-28"), as.Date("2022-03-11")))
)

如果 between 有一个版本可以避免显式转换为日期,那就太好了。 (filter("2021-02-28" < Date, Date < "2022-03-11") 也适用于最后一步。)