【问题标题】:Open excel file with dates and times in R在R中打开带有日期和时间的excel文件
【发布时间】:2020-09-28 19:32:34
【问题描述】:

如果已经在其他地方问过这个问题,请提前道歉,但我尝试了不同的尝试,但到目前为止没有任何效果。

我希望使用以下方法打开一个大 Excel 文件(> 21000 行):

    myData <- read.xlsx("....xlsx", sheet = 1, colNames = TRUE)

我有两列日期需要转换为“01-01-2019”格式而不是“43000”格式。因此我使用:

    myData$Begin.Date <- convertToDate(myData$Begin.Date)
    myData$End.Date <- convertToDate(myData$End.Date)

然后,我在 Excel 文件中也有两列时间(小时:分钟,范围从 00:00 到 23:59)。但是,当我在 R 中读取 Excel 文件时,所有小时都转换为从 0 到 0,99 的值。如何转换这两个列以保持“小时:分钟”格式?如果我使用 convertToDate 函数,现在显示为 0 的值 00:00 将转换为“1899-12-30”

    myData$Begin.Time <- ??(myData$Begin.Time)
    myData$End.Time <- ??(myData$End.Time)

这是我到目前为止所获得的:

    > myData <- read.xlsx("....xlsx", sheet = 1, colNames = TRUE)
    > myData$Begin.Date <- with(myData, convertToDateTime(Begin.Date))
    > myData$End.Date <- with(myData, convertToDateTime(End.Date))
    > myData$Begin.Time <- with(myData, convertToDateTime(Begin.Time))
    > myData$End.Time <- with(myData, convertToDateTime(End.Time))
    > head(myData, 2)
             xxxxx yyyyy zzzzz aaaaa bbbbb nnnnnn qqqqq ssssss
    1 xxx     yyy  zzz   aaa   yyyyyy tttttt  B  rrr
    2 xxx     yyy  zzz   aaa   yyyyyy tttttt  B  rrr
      kkkkkk mmmmmm ooooo Begin.Date Begin.Time   End.Date   End.Time 
    1 u       yyy     y   2019-01-01 1899-12-30 2019-01-29 1899-12-30      
    2 u       yyy     y   2019-01-01 1899-12-30 2019-01-29 1899-12-30


    dput(head(myData,3))
    structure(list(Sample_ID = c("...", "...", "..."), Locality.Name = c("...", "...", "..."), Code = c("...", "...", "..."), Catchment =  c("...", 
    "...", "..."), Decimal.Latitude = c(..., ..., ...), Decimal.Longitude = c(..., ..., ...), Sample.type = c("...", 
    "...", "..."), Sample.Treatment = c(".", ".", "."), Chemicals = c("...", "...", "..."), Apparatus.Type = c(".", ".", "."), 
    Begin.Date = c(43466, 43466, 43466), Begin.Time = c(0, 0, 0), End.Date = c(43494, 43494, 43494), End.Time = c(0, 0, 0), Value = c(..., ..., .), Value.Type = c("A", "A", "A"), Measuring.Unit = c("...", "...", "..."), Uncertainty.Value = c(..., .., ..),   Uncertainty.Type = c(".", ".","."), Uncertainty.Unit = c("...", "...", "..."), Laboratory = c("...", "...", "..."), class = "data.frame")

【问题讨论】:

  • 每个r 标签(悬停或点击查看):请提供最小和reproducible example(s) 以及所需的输出。对数据使用dput(),并使用library() 调用指定所有非基础包。
  • 好的。看看我对我的问题的编辑:)
  • 输入数据的一个例子会很有帮助:dput(head(myData,3))
  • 查看我对问题的编辑
  • 我下面的回答是否没有解决这个建议使用convertToDateTime 的问题?剩下的问题是什么?请记住,R 本身没有 Time 类型(与 Date 不同)。

标签: r excel date time


【解决方案1】:

@Parfait 知道了:

openxlsx::convertToDateTime(myData$Begin.Date+myData$Begin.Time)

例如:

myData <- data.frame(Begin.Date = 43000:43010,
                     Begin.Time = seq(0,1,0.1)) 
openxlsx::convertToDateTime(myData$Begin.Date+myData$Begin.Time)

 [1] "2017-09-22 00:00:00 CEST" "2017-09-23 02:24:00 CEST" "2017-09-24 04:48:00 CEST" "2017-09-25 07:12:00 CEST"
 [5] "2017-09-26 09:36:00 CEST" "2017-09-27 12:00:00 CEST" "2017-09-28 14:24:00 CEST" "2017-09-29 16:48:00 CEST"
 [9] "2017-09-30 19:12:00 CEST" "2017-10-01 21:36:00 CEST" "2017-10-03 00:00:00 CEST"

openxlsx::convertToDateTime 所做的是将Begin.Date 转换为 POSIXct,取 Excel Origin 即“1899-12-30”,将小数部分 Begin.Time(介于 0 和 1 之间)乘以一天中的秒数(84600),并考虑时区(因为 as.Date 强制 UTC):

myData <- data.frame(Begin.Date = 43000:43010,
                     Begin.Time = seq(0,1,0.1)) 
as.POSIXct(as.Date(myData$Begin.Date,origin='1899-12-30'))+myData$Begin.Time*86400-3600*2

 [1] "2017-09-22 00:00:00 CEST" "2017-09-23 02:24:00 CEST" "2017-09-24 04:48:00 CEST" "2017-09-25 07:12:00 CEST" "2017-09-26 09:36:00 CEST"
 [6] "2017-09-27 12:00:00 CEST" "2017-09-28 14:24:00 CEST" "2017-09-29 16:48:00 CEST" "2017-09-30 19:12:00 CEST" "2017-10-01 21:36:00 CEST"
[11] "2017-10-03 00:00:00 CEST"

【讨论】:

  • Begin.Time 是数字还是字符? lubridate::seconds_to_period(86400*0.5) 给我“12H 0M 0S”,但 lubridate::seconds_to_period(86400*"0,5") 给我一个错误
  • 它是数字。 R 接受它,但我没有看到列有任何变化,值仍在 [0,1] 范围内
  • 对不起,我不明白为什么,但它仍然不起作用。 Begin.Time 列中的所有值仍在 0 和 1 之间
  • 你看到你的数据和我更新的例子有区别吗?
【解决方案2】:

考虑添加两个数字向量并使用convertToDateTimePOSIXct 类型呈现正确的日期时间格式。这是有效的,因为 R 没有专门的 Time 类型(尽管它确实有 Date)。但是使用POSIXct,您可以同时携带这两个组件,并且仍然可以运行日期或时间级别的操作。

myData <- read.xlsx("/path/to/myWorkbook.xlsx", sheet = 1, colNames = TRUE)

myData$Begin.DateTime <- with(myData, convertToDateTime(Begin.Date + Begin.Time))
myData$End.DateTime <- with(myData, convertToDateTime(End.Date + End.Time))

为了演示,如果 Excel 工作表如下所示:

使用convertToDateTime,R 再现完全相同的日期/时间值:

myData <- read.xlsx("/path/to/myWorkbook.xlsx", sheet = 1, colNames = TRUE)

myData$DateTime <- with(myData, convertToDateTime(DATE + TIME))

head(myData, 10)

    GROUP INT        NUM CHAR  BOOL  DATE       TIME            DateTime
1   stata   8 127.666866  aEi  TRUE 41834 0.45681916 2014-07-14 10:57:49
2  python   5  34.688263  H2o FALSE 36231 0.08267816 1999-03-12 01:59:03
3   julia   1  -3.964953  lsf  TRUE 29694 0.08998882 1981-04-18 02:09:35
4       r   7  86.658479  Qvq FALSE 37560 0.42211337 2002-10-31 10:07:50
5     sas  10 -51.684354  Nwz FALSE 28965 0.68242260 1979-04-20 16:22:41
6    spss   2  57.717068  7mQ  TRUE 29167 0.99936381 1979-11-08 23:59:05
7  python  11 101.840519  Qwa FALSE 29638 0.72010194 1981-02-21 17:16:56
8  python   6  27.396547  viO FALSE 27524 0.02126105 1975-05-10 00:30:36
9   stata   5  36.561838  Z01 FALSE 30932 0.74739582 1984-09-07 17:56:14
10  julia   6 -60.987695  jSP FALSE 32613 0.25558634 1989-04-15 06:08:02

str(myData)

'data.frame':   500 obs. of  8 variables:
$ GROUP   : chr  "stata" "python" "julia" "r" ...
$ INT     : num  8 5 1 7 10 2 11 6 5 6 ...
$ NUM     : num  127.67 34.69 -3.96 86.66 -51.68 ...
$ CHAR    : chr  "aEi" "H2o" "lsf" "Qvq" ...
$ BOOL    : chr  "TRUE" "FALSE" "TRUE" "FALSE" ...
$ DATE    : num  41834 36231 29694 37560 28965 ...
$ TIME    : num  0.4568 0.0827 0.09 0.4221 0.6824 ...
$ DateTime: POSIXct, format: "2014-07-14 10:57:49" "1999-03-12 01:59:03"...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2017-09-17
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多