Моим первым предположением было то, что read.xlsx()
пытается угадать выглядящие по дате столбцы в .xlsx, пока он читает файл, и странным образом преобразует время из формата %I:%M %p
в доли по 24 часа (потому что, например, 0.3333333 * 24 = 7.999999
, что в точности равно 8,0 ).Но позже я заметил, что если я изменяю параметр detectDates
на FALSE
, то на самом деле ничего не меняется - он выдает тот же кадр данных.Так что он ничего не догадывается, он просто читает TIME
как есть.
Если вы попытаетесь изменить 10:00 PM
в книге Excel, вы увидите, что она действительно хранится как 22:00:00
.Так почему же в конце он представляется как дробь 24
?!Я не знаю, и я надеюсь, что кто-то может это объяснить.
@ Подход Рэндалла - действительно хорошая альтернатива по сравнению с openxlsx::read.xlsx()
.Обратите внимание, что read_xlsx()
распознает TIME
как %H:%M:%S
и преобразует его в фиктивный объект POSIXct/POSIXt
, то есть 1899-12-31 08:00:00
и 1899-12-31 22:00:00
.
Удивительно, но read_xlsx()
не распознает этоDATE
имеет формат %d-%m-%Y
и интерпретирует его как character
.Это означает, что нам нужно преобразовать обе переменные в соответствующий формат для получения желаемого результата.
Я не думаю, что нам нужно использовать gsub
, чтобы получить 12-часовое время от объекта POSIXct
,гораздо проще использовать format
для этой цели.А преобразование DATE
из %d-%m-%Y
в %Y-%m-%d
формат является даже более простой задачей:
library(dplyr)
library(readxl)
read_xlsx("myfile.xlsx") %>%
mutate(
DATE = as.Date(DATE, "%d/%m/%Y"),
TIME = format(TIME, "%I:%M %p") # “That’s what I do: I drink and I know things.”
)
, который производит:
# A tibble: 2 x 2
DATE TIME
<date> <chr>
1 2015-02-15 08:00 AM
2 2014-01-22 10:00 PM