首页> 疑难解答

如何结合dplyr mutate和case_when函数使用lubridate as_datetime函数?

withpy 2021-06-18

简介我试图操纵一个dttm变量来根据数字id向量调整不同的时区。我可以根据id操纵变量而不会出现使用字符向量的问题......

我试图操纵一个dttm变量来根据数字id向量调整不同的时区。我可以根据id操纵变量,而不会使用字符向量作为新值。但是,当我尝试使用date_time()函数创建新值时,每个值都会接收case_when中第一个项的结果。

id向量是数字,我试图将类转换为因子和字符。这个问题属于。

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

df1 <- tibble(
  id = c(1, 2, 3),
  date_time = rep(as_datetime("2018-01-01 12:34:56", tz = "Europe/Zurich"), 3)
) %>% 
  mutate(
    date_time2 = case_when(
      id == 1 ~ "one",
      id == 2 ~ "two",
      TRUE ~ "three"
    )
  )


df2 <- tibble(
  id = c(1, 2, 3),
  date_time = rep(as_datetime("2018-01-01 12:34:56", tz = "Europe/Zurich"), 3)
) %>% 
  mutate(
    date_time2 = case_when(
      id == 1 ~ as_datetime(date_time, tz = "America/New_York"),
      id == 2 ~ as_datetime(date_time, tz = "Asia/Kolkata"),
      TRUE ~ date_time
    )
  )

df3 <- tibble(
  id = c(1, 2, 3),
  date_time = rep(as_datetime("2018-01-01 12:34:56", tz = "Europe/Zurich"), 3)
) %>% 
  mutate(
    date_time2 = case_when(
      id == 1 ~ as_datetime(date_time, tz = "Asia/Kolkata"),
      id == 2 ~ as_datetime(date_time, tz = "America/New_York"),
      TRUE ~ date_time
    )
  )


df1 
#> # A tibble: 3 x 3
#>      id date_time           date_time2
#>   <dbl> <dttm>              <chr>     
#> 1     1 2018-01-01 12:34:56 one       
#> 2     2 2018-01-01 12:34:56 two       
#> 3     3 2018-01-01 12:34:56 three

df2
#> # A tibble: 3 x 3
#>      id date_time           date_time2         
#>   <dbl> <dttm>              <dttm>             
#> 1     1 2018-01-01 12:34:56 2018-01-01 06:34:56
#> 2     2 2018-01-01 12:34:56 2018-01-01 06:34:56
#> 3     3 2018-01-01 12:34:56 2018-01-01 06:34:56

df3
#> # A tibble: 3 x 3
#>      id date_time           date_time2         
#>   <dbl> <dttm>              <dttm>             
#> 1     1 2018-01-01 12:34:56 2018-01-01 17:04:56
#> 2     2 2018-01-01 12:34:56 2018-01-01 17:04:56
#> 3     3 2018-01-01 12:34:56 2018-01-01 17:04:56

reprex package创建于2019-03-26(v0.2.1)

df1展示了我的期望。

df2,我希望在date_time2 == 2的id显示“2018-01-01 17:04:56”而不是“2018-01-01 06:34:56”。

df3,我期待在date_time2 == 3的id显示“2018-01-01 12:34:56”而不是“2018-01-01 17:04:56”。

1
投票

这似乎是一个错误(可能是dpylr,因为之前有过日期问题)。

这是一个可能的工作arround(不要问我为什么它的工作:))

tibble(
  id = c(1, 2, 3),
  date_time = rep(as_datetime("2018-01-01 12:34:56", tz = "Europe/Zurich"), 3)
) %>% 
  mutate(
    date_time2 = case_when(
      id == 1 ~ as_datetime(as.character(as_datetime(date_time, tz = "America/New_York"))),
      id == 2 ~ as_datetime(as.character(as_datetime(date_time, tz = "Asia/Kolkata"))),
      TRUE ~  as_datetime(as.character(date_time))

    )
  )

# A tibble: 3 x 3
     id date_time           date_time2         
  <dbl> <dttm>              <dttm>             
1     1 2018-01-01 12:34:56 2018-01-01 06:34:56
2     2 2018-01-01 12:34:56 2018-01-01 17:04:56
3     3 2018-01-01 12:34:56 2018-01-01 12:34:56

1
投票

我们可以使用force_tzs包中的lubridate。我们可以为tzones参数提供不同的时区设置。在这种情况下,如果您知道时区的顺序,则不需要case_when

library(dplyr)
library(lubridate)

df2 %>%
  mutate(date_time2 = force_tzs(date_time, tzones = c("America/New_York", "Asia/Kolkata", "UTC")))
# # A tibble: 3 x 3
#      id date_time           date_time2         
#   <dbl> <dttm>              <dttm>             
# 1     1 2018-01-01 12:34:56 2018-01-01 17:34:56
# 2     2 2018-01-01 12:34:56 2018-01-01 07:04:56
# 3     3 2018-01-01 12:34:56 2018-01-01 12:34:56

df3 %>%
  mutate(date_time2 = force_tzs(date_time, tzones = c("Asia/Kolkata", "America/New_York", "UTC")))
# # A tibble: 3 x 3
#      id date_time           date_time2         
#   <dbl> <dttm>              <dttm>             
# 1     1 2018-01-01 12:34:56 2018-01-01 07:04:56
# 2     2 2018-01-01 12:34:56 2018-01-01 17:34:56
# 3     3 2018-01-01 12:34:56 2018-01-01 12:34:56

相关文章

  • envp代表什么? [关闭]

    我想知道envp的用途,例如:int main(int argc,char ** argv,char ** envp);我也想知道argv究竟代表什么:v是值或向量。

  • 以编程方式从C#恢复ms-sql系统数据库

    从恢复“普通”数据库的角度来看,处理程序化备份恢复有很多问题和答案,对于像[master]这样的系统数据库这样做,[...

  • 如何从Chrome获取图片

    我正在编写一些使用Chrome DevTools协议控制Chrome的测试代码。打开网页后,我需要从页面获取图像。获取图片网址很容易,但我想......

  • 如何在DolphinDB的数据浏览器中显示Vector的值?

    我在DolphinDB的GUI中执行以下代码。收入=表(2016.07.31 - 10..1为日期,兰特(100,10)为收入); eventdates = [2016.07.22,2016.07.25,2016.07.29]; x = incomes.date.binsrch(...

  • 如何从sequelize中获取父表中的数据

    我正在使用Sequelize依赖项我想从父表中获取数据,我有一个与routedetails相关联的表tblroute .tblroute的id是routedetails中的外键router.get(&#39;...

  • 在iOS上使用Firebase SDK作为全新设备启动

    我正在使用官方SDK在iOS应用中实现Firebase(Auth,Realtime DB和Firebase)。用户被认证为匿名用户,其余用户取决于成功...