簡體   English   中英

使用 R 從 excel 表讀取時如何檢測時間

[英]How to detect TIME when reading from an excel sheet using R

問題是,當我使用來自 openxlsx package 的read.xlsxopenxlsx工作表讀取到 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) 

Output:

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

我不確定它為什么這樣做以及是否有辦法解決這個問題,因為我需要同時使用 DATE 和 TIME 來進行一些計算。

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

我的第一個猜測是read.xlsx()試圖在讀取文件時猜測.xlsx中具有日期的列,並將時間從%I:%M %p格式轉換為24小時的小數部分(例如0.3333333 * 24 = 7.999999 ,正好是8.0 )。 但是后來我注意到,如果將參數detectDates更改為FALSE什么都沒有真正改變-它輸出相同的數據幀。 因此,它沒有任何猜測,它只是按原樣讀取TIME

如果您嘗試在Excel工作簿中編輯10:00 PM ,您將看到它確實存儲為22:00:00 那么,為什么最后將其表示為24的分數呢? 我不知道,希望有人能解釋。

openxlsx::read.xlsx()相比, 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小時時鍾時間, 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

我遇到了同樣的問題,並按如下方式解決了它——又快又臟:

  • 使用readxl:read_excel()讀取數據。

  • 不失一般性,我們只看從"0.72222222222222"而不是包含時間數據的列中獲得17:20 請注意,從 excel 文件中讀取值可能具有不需要的類型,但對於計算,我們需要數字。

x <- as.numeric("0.72222222222222") 

minutes <- round((x*24 %% 1)*60, digits = 0) 
hours <- x - minutes
paste0(hours, ":", minutes)
#17:20
  1. 讀取時間值作為“日期”:

     test <- read_excel('dfin.xlsx', col_types = c("date"), ...)
  2. 然后用substr()修剪它以獲得時間:

     test <- substr(test,12,16)

在 chron package 中使用 times() function 將給出解決方案:

圖書館(時間)

次(0.111)

[1] 02:39:50

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM