首页 > 解决方案 > 如何在 R 中将 POSIXct 向量的选择从 YDM 更改为 YMD?

问题描述

我有一个带有 YMD_HMS 格式的 POSIXct 日期时间的大型数据集。然而,我意识到有些日期是以 YDM_HMS 格式而不是 YMD_HMS 格式输入到数据库中的。这在下面的密度图中可见。 日期时间

观测在 3 月和 4 月运行,但不知何故,从 4 月 1 日到 4 月 12 日被错误地添加了,因此分布在全年。显然我想把 YDM 换成 YMD,但我失败了……

一个可重现的例子是这个df:

df <- data.frame(id = c(1:10), datetime = ymd_hms("2020-03-01 00:02:15",
                                                     "2020-03-25 01:03:33",
                                                     "2020-03-14 03:45:55",
                                                     "2020-01-04 05:37:27",
                                                     "2020-01-04 06:23:38",
                                                     "2020-04-12 09:09:43",
                                                     "2020-04-21 12:44:47",
                                                     "2020-02-04 17:38:52",
                                                     "2020-04-24 19:44:21",
                                                     "2020-04-28 21:49:34",
                                                     tz = "UTC"))

我制作了一个包含日期的额外向量,因此我可以轻松定位错误的观察结果:

df$date <- as.Date(df$datetime)

然后我想我可以很容易地使用ifelse(). 条件是选择错误的日期,TRUE 动作是将其强制转换为字符,然后转换为 ydm_hms,FALSE 动作是保持日期时间。这失败了...

df <- df %>%
   ifelse(date %in% c("2020-01-04", "2020-02-04"), ydm_hms(as.character(datetime), tz = "UTC"), datetime)
Error in ifelse(., date %in% c("2020-01-04", "2020-02-04"), ydm_hms(as.character(datetime),  : 
  unused argument (datetime)

mutate()像这样添加df <- df %>% mutate(datetime = ifelse(date %in% c("2020-01-04", "2020-02-04"), ydm_hms(as.character(datetime), tz = "UTC"), datetime))不会为日期时间向量维护 POSIXct 格式:

> df
   id   datetime       date
1   1 1583020935 2020-03-01
2   2 1585098213 2020-03-25
3   3 1584157555 2020-03-14
4   4 1578116247 2020-01-04
5   5 1578119018 2020-01-04
6   6 1586682583 2020-04-12
7   7 1587473087 2020-04-21
8   8 1580837932 2020-02-04
9   9 1587757461 2020-04-24
10 10 1588110574 2020-04-28

问题:如何获得此输出:

   id            datetime
1   1 2020-03-01 00:02:15
2   2 2020-03-25 01:03:33
3   3 2020-03-14 03:45:55
4   4 2020-04-01 05:37:27
5   5 2020-04-01 06:23:38
6   6 2020-04-12 09:09:43
7   7 2020-04-21 12:44:47
8   8 2020-04-02 17:38:52
9   9 2020-04-24 19:44:21
10 10 2020-04-28 21:49:34

标签: rdate

解决方案


您可以获取日期为其中之一的行的索引,c("2020-01-04", "2020-02-04")并使用 更改这些日期 ydm_hms

df$date <- as.Date(df$datetime)
inds <- df$date %in% as.Date(c("2020-01-04", "2020-02-04"))
df$datetime[inds] <- lubridate::ydm_hms(df$datetime[inds])

df
#   id            datetime       date
#1   1 2020-03-01 00:02:15 2020-03-01
#2   2 2020-03-25 01:03:33 2020-03-25
#3   3 2020-03-14 03:45:55 2020-03-14
#4   4 2020-04-01 05:37:27 2020-01-04
#5   5 2020-04-01 06:23:38 2020-01-04
#6   6 2020-04-12 09:09:43 2020-04-12
#7   7 2020-04-21 12:44:47 2020-04-21
#8   8 2020-04-02 17:38:52 2020-02-04
#9   9 2020-04-24 19:44:21 2020-04-24
#10 10 2020-04-28 21:49:34 2020-04-28

推荐阅读