r - 如何在 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
解决方案
您可以获取日期为其中之一的行的索引,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
推荐阅读
- python - I can't think of a way to aviod dynamic variable in this case
- python - 如何从边界框裁剪图像并为每个框创建新图像
- ruby-on-rails - Rails Heroku Cloudflare 设置 - www 不起作用
- javascript - 使用请求参数从 Cloud Function 内部运行查询
- tensorflow - 我可以在 tensorflow 联合中聚合梯度吗?
- c# - 从具有共享边的列表中获取行的特定值
- jquery - jQuery“不支持的伪:必需”仅在 IE 中
- c# - C# MVC 连接尝试失败,因为连接方在一段时间后没有正确响应
- python - 通过熊猫中的上下值替换列的元素(如果连续值相差 10 )
- ios - 如何查看表格视图的按钮顶部?