R и dplyr: преобразовать переменную формата 'dttm' в 'POSIXCT' - PullRequest
1 голос
/ 29 октября 2019

Работая с , эти переменные со странным форматом dttm отображаются следующим образом:

 tpep_pickup_datetime  tpep_dropoff_datetime 
               <dttm>                 <dttm>               
  2015-01-15 18:05:39    2015-01-15 18:23:42                    
  2015-01-10 19:33:38    2015-01-10 19:53:28              
  2015-01-10 19:33:38    2015-01-10 19:43:41              
  2015-01-10 19:33:39    2015-01-10 19:35:31               

Я хотел бы рассчитать разницу во времени в терминахсекунд от tpep_pickup_datetime до tpep_dropoff_datetime.

Но при использовании пакета lubridate это не работает. Как я могу преобразовать эти переменные в POSIXCT формат , используя dplyr?

Когда я использую следующий код:

my_df %>% mutate(diff_time = difftime(tpep_dropoff_datetime,tpep_pickup_datetime,units = "secs"))

Я получаю эту ошибку:

org.apache.spark.sql.catalyst.parser.ParseException: extraneous input 'AS' expecting {')', ','}(line 1, pos 121)

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

попробуйте это:

  all_data <- all_data %>%
      mutate(new_pickup = as.POSIXct(tpep_pickup_datetime)) %>%
      mutate(day_pickup = as.Date(new_pickup)) %>%
      mutate(time_pickup = paste(hour(new_pickup), minute(new_pickup),second(new_pickup),sep="-")) %>%
      mutate(new_dropoff = as.POSIXct(tpep_dropoff_datetime)) %>%
      mutate(day_dropoff = as.Date(new_dropoff)) %>%
      mutate(time_dropoff = paste(hour(new_dropoff), minute(new_dropoff),second(new_dropoff),sep="-")) %>%
      mutate(trip_duration = ((hour(new_dropoff) - hour(new_pickup))*3600 + (minute(new_dropoff) - minute(new_pickup))*60 + (second(new_dropoff) - second(new_pickup))))
0 голосов
/ 29 октября 2019

Так же, как этот ваш вопрос мы можем использовать dplyr, lubridate::seconds_to_period и base::difftime для получения вывода.

library(dplyr)
library(lubridate)

df1 %>% 
  mutate(dur = seconds_to_period(as.numeric(difftime(tpep_dropoff_datetime, 
                                                     tpep_pickup_datetime), 
                                                     units = "secs")))

#> # A tibble: 4 x 3
#>   tpep_pickup_datetime tpep_dropoff_datetime dur     
#>   <dttm>               <dttm>                <Period>
#> 1 2015-01-15 18:05:39  2015-01-15 18:23:42   18M 3S  
#> 2 2015-01-10 19:33:38  2015-01-10 19:53:28   19M 50S 
#> 3 2015-01-10 19:33:38  2015-01-10 19:43:41   10M 3S  
#> 4 2015-01-10 19:33:39  2015-01-10 19:35:31   1M 52S

Если вы хотите, чтобы вывод в secs а не as.period, тогда код ниже работает.

library(dplyr)

df1 %>% 
  mutate(dur = as.numeric(difftime(tpep_dropoff_datetime, 
                                                     tpep_pickup_datetime), 
                                            units = "secs"))

#> # A tibble: 4 x 3
#>   tpep_pickup_datetime tpep_dropoff_datetime   dur
#>   <dttm>               <dttm>                <dbl>
#> 1 2015-01-15 18:05:39  2015-01-15 18:23:42    1083
#> 2 2015-01-10 19:33:38  2015-01-10 19:53:28    1190
#> 3 2015-01-10 19:33:38  2015-01-10 19:43:41     603
#> 4 2015-01-10 19:33:39  2015-01-10 19:35:31     112

Данные:

read.table(text="tpep_pickup_datetime  tpep_dropoff_datetime 
  2015-01-15_18:05:39    2015-01-15_18:23:42                    
  2015-01-10_19:33:38    2015-01-10_19:53:28              
  2015-01-10_19:33:38    2015-01-10_19:43:41              
  2015-01-10_19:33:39    2015-01-10_19:35:31", stringsAsFactors=F, header=T) -> df1


df1 %>% 
  mutate_at(vars("tpep_pickup_datetime", "tpep_dropoff_datetime"), 
            list(~as.POSIXct(.,format="%Y-%m-%d_%H:%M:%S",tz=Sys.timezone()))) %>% 
  as_tibble -> df1

df1 #just to show the data

#>   tpep_pickup_datetime tpep_dropoff_datetime
#>   <dttm>               <dttm>               
#> 1 2015-01-15 18:05:39  2015-01-15 18:23:42  
#> 2 2015-01-10 19:33:38  2015-01-10 19:53:28  
#> 3 2015-01-10 19:33:38  2015-01-10 19:43:41  
#> 4 2015-01-10 19:33:39  2015-01-10 19:35:31  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...