[英]How to detect TIME when reading from an excel sheet using R
問題是,當我使用來自 openxlsx package 的read.xlsx
從openxlsx
工作表讀取到 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:00
和1899-12-31 22:00:00
。
令人驚訝的是, read_xlsx()
無法識別DATE
具有%d-%m-%Y
格式,並將其解釋為character
。 這意味着我們需要將兩個變量都轉換為適當的格式,以便獲得所需的輸出。
我認為我們不需要使用gsub
從POSIXct
對象獲取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
讀取時間值作為“日期”:
test <- read_excel('dfin.xlsx', col_types = c("date"), ...)
然后用substr()
修剪它以獲得時間:
test <- substr(test,12,16)
在 chron package 中使用 times() function 將給出解決方案:
圖書館(時間)
次(0.111)
[1] 02:39:50
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.