Как определить ВРЕМЯ при чтении из листа Excel с помощью R - PullRequest
0 голосов
/ 01 февраля 2019

Проблема заключается в том, что при чтении из листа Excel в R с использованием read.xlsx из пакета openxlsx столбец TIME преобразуется в дробь.

Вот пример,

dfin <-
DATE          TIME
15/02/2015    8:00 AM
22/01/2014    10:00 PM

library(openxlsx)
test <-  read.xlsx("dfin.xlsx", sheet = 1,
                 detectDates=TRUE, skipEmptyRows = TRUE,
                 skipEmptyCols = TRUE, rows = NULL, cols = NULL, check.names = FALSE,
                 namedRegion = NULL, na.strings = "NA", fillMergedCells = FALSE) 

Вывод:

  DATE        TIME
  2015-02-15  0.3333333
  2014-01-22  0.9166667

Я не уверен, почему это происходит, и есть ли способ исправить это, поскольку мне нужно использовать DATE и TIME для выполнения некоторых вычислений.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Моим первым предположением было то, что 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
0 голосов
/ 01 февраля 2019

R на самом деле не имеет формата времени, поэтому я предлагаю прочитать его, используя read_excel, который автоматически определяет тип столбца.Это преобразует его в формат даты и времени со случайной датой, которую затем можно удалить, прежде чем преобразовать в надлежащую метку времени.

library(readxl)
library(lubridate)

test <- read_excel('dfin.xlsx',trim_ws = TRUE) %>%
  #return the TIME column to the way it is written in Excel
  mutate(TIME = as.character(gsub(".* ","",TIME)),
  #format the date column
     DATE = dmy(DATE),
  #turn it into a timestamp
     TIMESTAMP = as.POSIXct(paste(DATE,TIME)))
...