преобразование с 12 часов до 24 часов в R и объединить две таблицы - PullRequest
0 голосов
/ 30 ноября 2018

Изображение для таблицы Y

введите описание изображения здесь

Я хочу выполнить объединение двух таблиц пробная и пробная2 с ключом в качестве метки времени.Одна таблица 'trial' имеет метку времени POSIXct в качестве ключа, а другая 'trial2' имеет метку времени в символе .Я попытался преобразовать временную метку 'trial2' из 12-часового формата в 24-часовой формат (POSIXct), чтобы я мог применить к ним объединение.Но все, что я использовал до сих пор, дало мне NULL в итоговом поле ролли для испытания2

library(data.table)
library(dplyr)
library(lubridate)
library(readr)
library(hms)
trial <- read_csv("X.csv")
trial2 <- read_csv("Y.csv")
trial2$rolli<- as.POSIXct(trial2$date ,format = '%m/%d/%Y  %I:%M:%S %p')
#######OR#########
trial2$rolli<-strptime(trial2$date, "%m/%d/%Y  %I:%M:%S %p")
#######OR#########    
trial2$rolli<-ymd_hms(trial2$date)
trial<-mutate(trial, rolli=ymd_hms(paste("2018-11-27", Time), tz='Asia/Kolkata'))
trial<-data.table(trial)
trial2<-data.table(trial2)
setkey(trial, rolli)
setkey(trial2, rolli)
try<-trial[trial2, roll = "nearest"]

class(trial$rolli)
#[1] "POSIXct" "POSIXt"

class(trial2$rolli)
#[1] "POSIXct" "POSIXt"

1 Ответ

0 голосов
/ 02 декабря 2018

Отладка всегда трудна, поэтому общий совет: постарайтесь уменьшить ее как можно больше.

Глядя на это, я думаю, что при разборе символа возникает проблема.Я не уверен насчет lubridate и ymd_hms, но вызовы as.POSIXct и strptime должны работать.
Вы можете проверить, напечатав trial2 $ date и trial2 $ rolli.Если дата выглядит хорошо, но rolli состоит из всех NA, то в этом проблема.

Вероятно, даты, представленные в виде символов, не в правильном формате, эти функции могут быть очень разборчивы.
В порядкечтобы точно знать, что идет не так, мне нужно увидеть пример Y.csv, но вы можете проверить, правильно ли вы ввели все: пробелы или вы переключили "\" и "/"?Кроме того, я обычно работаю с 24-часовой нотацией, поэтому может случиться так, что strptime требователен к спецификации, являющейся «am», «AM», «am» или чем-то другим.

РЕДАКТИРОВАТЬ: Я имеювидел формат, который вы пытаетесь предоставить, который имеет десятичные дроби в секундах, что означает, что% S не справляется с задачей.
Вместо этого вы хотите% OS (это в справке для? strptime, но это довольноскрытый).Кроме того, я не могу видеть это ясно на изображении, но в вашем исходном коде есть 2 пробела между "% Y" и "% I".Также есть 2 в вашем вводе?

В любом случае:

strptime('11/27/2018 11:44:04.479 AM', format='%m/%d/%Y %I:%M:%OS %p')
# Works with me
trial2$rolli<-strptime(trial2$date, "%m/%d/%Y %I:%M:%OS %p")
# Should solve your problem.

Кроме того, когда печать trial2 $ rolli, дробная часть не отображается, но она хранится .Вы можете показать это с помощью as.numeric(trial2$rolli) %% 1, хотя могут быть небольшие различия в округлении.

2-е РЕДАКТИРОВАНИЕ: Чтобы исправить проблемы, когда у вас есть время, например, 0:00 PM на входе (что технически неправильно, но выможет не контролировать ваш ввод), вы можете использовать:

trial2$date <- sub('0+(:..:..)', '12\1', trial2$date)

Он заменяет все вхождения формы 0 : restoftime или 00 : restoftime с 12: restoftime
Только будьте осторожны с тем, что ваш источник на самом деле имеет в виду, например, 0: 00: 00.000 утра: это полночь или полдень?Я не знаю, как R-функции справляются с этим вообще (или даже если это гарантированно всегда будет одним и тем же), и я не собираюсь опускать руки на этот вопрос.Если вы посмотрите в интернете, то есть много людей, которые имеют очень сильные мнения о том, что AM / PM означает в этих обстоятельствах во всех вариациях.

...