gpt4 book ai didi

r - dplyr::if_else 更改日期时间 (POSIXct) 值

转载 作者:行者123 更新时间:2023-12-03 23:04:29 24 4
gpt4 key购买 nike

我正在处理一个有很多时间戳的数据集。我尝试识别一些无效的时间戳并将其设置为 NA。因为 if_else()强制我在两个臂上使用相同的数据类型,我正在使用 as.POSIXct(NA)对此类缺失值进行编码。
有趣的是,当我在 true 中反转测试(并更改 falseif_else() 参数)时,结果会有所不同。 .
下面是一些代码来说明我的问题:

x <- tibble(
A = parse_datetime("2020-08-18 19:00"),
B = if_else(TRUE, A, as.POSIXct(NA)),
C = if_else(FALSE, as.POSIXct(NA), A)
)

> x
# A tibble: 1 x 3
A B C
<dttm> <dttm> <dttm>
1 2020-08-18 19:00:00 2020-08-18 19:00:00 2020-08-18 21:00:00
知道为什么 C 晚了两个小时吗?
跟进:
基于下面的好答案,我认为一个更具可读性的解决方案应该可以生成一个缺失的日期时间对象 parse_datetime(NA_character_)并在代码中使用它而不是 as.POSIXct() .
R> NA_datetime_ <- parse_datetime(NA_character_)

R> x <- tibble(
A = parse_datetime("2020-08-18 19:00"),
B = if_else(TRUE, A, NA_datetime_),
C = if_else(FALSE, NA_datetime_, A)
)

R> map(x, lubridate::tz)
$A
[1] "UTC"

$B
[1] "UTC"

$C
[1] "UTC"

最佳答案

首先,您需要知道parse_datetime()返回带有 tzone 的日期时间对象属性默认为 UTC .您可以使用 lubridate::tz(x$A)attributes(x$A)检查它。
来自 if_else() 的文档,它说 truefalse参数必须是相同的类型。所有其他属性均取自 true .因此,在部分 C你的小玩意:

C = if_else(FALSE, as.POSIXct(NA), A)
as.POSIXct(NA)没有 tzone属性,所以 Atzone被删除并重置为您所在地区的时区。其实, C不是 两个小时后。三列具有相等的时间但不相等的时区。要修复它,您可以调整 as.POSIXct(NA)拥有 tzone属性,即将其替换为
as.POSIXct(NA_character_, tz = "UTC")
注:您必须使用 NA_character_而不是 NA因为 tz参数在 as.POSIXct()仅适用于角色对象。

最后,将您的代码修改为
x <- tibble(
A = parse_datetime("2020-08-18 19:00"),
B = if_else(TRUE, A, as.POSIXct(NA_character_, tz = "UTC")),
C = if_else(FALSE, as.POSIXct(NA_character_, tz = "UTC"), A)
)

# # A tibble: 1 x 3
# A B C
# <dttm> <dttm> <dttm>
# 1 2020-08-18 19:00:00 2020-08-18 19:00:00 2020-08-18 19:00:00
记得检查他们的时区。
R > lubridate::tz(x$A)
[1] "UTC"
R > lubridate::tz(x$B)
[1] "UTC"
R > lubridate::tz(x$C)
[1] "UTC"

关于r - dplyr::if_else 更改日期时间 (POSIXct) 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63473720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com