使用R从Excel工作表读取时如何检测时间

时间:2019-02-01 06:56:11

标签: r openxlsx

问题是,当我使用read.xlsx包中的openxlsx从excel工作表中读取到R时,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 :(得分:1)

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)))

答案 1 :(得分:1)

我的第一个猜测是read.xlsx()试图在读取文件时猜测.xlsx中具有日期的列,并将时间从%I:%M %p格式转换为24小时的小数部分(因为例如0.3333333 * 24 = 7.999999 which is exactly 8.0)。但是后来我注意到,如果将参数detectDates更改为FALSE,则什么都没有改变-它输出相同的数据帧。因此,它没有任何猜测,它只是按原样读取TIME

如果您尝试在Excel工作簿中编辑10:00 PM,则会看到它确实存储为22:00:00。那么,为什么最后将其表示为24的一部分呢?我不知道,希望有人能解释。

openxlsx::read.xlsx()相比,

@Randall方法确实是一个很好的选择。请注意,read_xlsx()TIME识别为%H:%M:%S,并将其转换为伪POSIXct/POSIXt对象,即1899-12-31 08:00:001899-12-31 22:00:00

令人惊讶的是,read_xlsx()无法识别出DATE具有%d-%m-%Y格式,并将其解释为character。这意味着我们需要将两个变量都转换为适当的格式,以便获得所需的输出。

我认为我们不需要使用gsubPOSIXct对象获取12小时的时钟时间,为此目的使用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