r语言 - 日期/时间格式的变量包含星期几



我正在尝试格式化包含星期几的日期列。当我尝试用我通常的方法格式化它时,我的时间总是00:00。下面是一个例子:

a <- c(1:6)
Date <- c("Tuesday, 05 December 2012 05:00","Tuesday, 05 December 2012 06:55","Tuesday, 05 December 2012 07:10",
"Tuesday, 05 December 2012 10:23", "Tuesday, 05 December 2012 11:43","Tuesday, 05 December 2012 13:04")
b <-c("0","0","0","1","1","1")
df1 <- data.frame(a,b,c,stringsAsFactors = FALSE)

如果我尝试使用以下代码更改格式:

df1 <- df1 %>%
mutate(DateTime = format(as.Date(Date, format = "%A, %d %B %Y %H:%M"), "%d-%m-%Y %H:%M"))

我得到一个小时和分钟总是00:00的响应。我相信这与日期不是POSIXct/POSIXlt格式有关,但我不确定。

a                            Date b         DateTime
1 1 Tuesday, 05 December 2012 05:00 0 05-12-2012 00:00
2 2 Tuesday, 05 December 2012 06:55 0 05-12-2012 00:00
3 3 Tuesday, 05 December 2012 07:10 0 05-12-2012 00:00
4 4 Tuesday, 05 December 2012 10:23 1 05-12-2012 00:00
5 5 Tuesday, 05 December 2012 11:43 1 05-12-2012 00:00
6 6 Tuesday, 05 December 2012 13:04 1 05-12-2012 00:00

谢谢!

可能是语言环境问题?

#store current locale, ans change to En
orig_locale <- Sys.getlocale("LC_TIME")
Sys.setlocale("LC_TIME", "English.UTF-8")
as.POSIXct(df1$b, format = "%A, %d %B %Y %H:%M")
#reset locale
Sys.setlocale("LC_TIME", orig_locale)
# [1] "2012-12-05 05:00:00 CET" "2012-12-05 06:55:00 CET" "2012-12-05 07:10:00 CET" "2012-12-05 10:23:00 CET"
# [5] "2012-12-05 11:43:00 CET" "2012-12-05 13:04:00 CET"

这里有另一种方法:

# data 
b <- c("Tuesday, 05 December 2012 05:00","Tuesday, 05 December 2012 06:55","Tuesday, 05 December 2012 07:10",
"Tuesday, 05 December 2012 10:23", "Tuesday, 05 December 2012 11:43","Tuesday, 05 December 2012 13:04")
# remove everything before first digit
b <- sub("^\D+", "", b)
# use ydm_hm() from {lubridate}
library(lubridate)
ydm_hm(b)
#> [1] "2005-12-20 05:00:00 UTC" "2005-12-20 06:55:00 UTC"
#> [3] "2005-12-20 07:10:00 UTC" "2005-12-20 10:23:00 UTC"
#> [5] "2005-12-20 11:43:00 UTC" "2005-12-20 13:04:00 UTC"

由reprex包(v2.0.1)创建于2022-06-07

编辑

符合你的风格:

a <- c(1:6)
b <- c("Tuesday, 05 December 2012 05:00","Tuesday, 05 December 2012 06:55","Tuesday, 05 December 2012 07:10",
"Tuesday, 05 December 2012 10:23", "Tuesday, 05 December 2012 11:43","Tuesday, 05 December 2012 13:04")
c <- c("0","0","0","1","1","1")
df1 <- data.frame(a, b, c, 
stringsAsFactors = FALSE)
library(lubridate)
library(dplyr)
df1 <- df1 |>
mutate(Datetime = ydm_hm(sub("^\D+", "", b))
) |>
rename(Date = b)
head(df1)
#>   a                            Date c            Datetime
#> 1 1 Tuesday, 05 December 2012 05:00 0 2005-12-20 05:00:00
#> 2 2 Tuesday, 05 December 2012 06:55 0 2005-12-20 06:55:00
#> 3 3 Tuesday, 05 December 2012 07:10 0 2005-12-20 07:10:00
#> 4 4 Tuesday, 05 December 2012 10:23 1 2005-12-20 10:23:00
#> 5 5 Tuesday, 05 December 2012 11:43 1 2005-12-20 11:43:00
#> 6 6 Tuesday, 05 December 2012 13:04 1 2005-12-20 13:04:00

由reprex包(v2.0.1)创建于2022-06-07

最新更新