【问题标题】:How to perform operations on date like "%Y/%m/%d %H:%M"?如何在“%Y/%m/%d %H:%M”之类的日期执行操作?
【发布时间】:2015-07-15 09:08:22
【问题描述】:

我的数据框中有 2 列,我想在这些列上执行添加小时数或添加天数等操作。

例如,我想检查我的 date2 是否在 [date1 ;日期1 + 30 天]

我试过了:

  table(data$date1 <= data$date2 & data$date2 <= data$date1 + 30)

我得到了这个错误:

  Error in data$date1 + 30 : 
  non-numeric argument to binary operator

我将 date1 和 date2 转换为日期格式:

  data$date1 <- substr(data$date1,1,16)
  data$date1 <- format(data$date1, format="%Y-%m-%d %H:%M")

这是我的数据头:

     id1   id2            date2              date1
  1 CD0H   15741        2012/02/08 10:03    16/02/2015 16:22
  2 CD00   15058        2011/05/19 09:25    07/05/2015 10:39
  3 CHY0   15987        2011/01/20 11:58    06/02/2015 14:11
  4 CTPO   15254        2010/09/29 12:45    01/04/2015 04:49
  5 CDHY   15051                            06/05/2015 15:01
  6 CDJU   15035                            17/04/2015 08:56

【问题讨论】:

  • data 长什么样子?
  • 你能发帖dput(head(data))吗?

标签: r datetime format


【解决方案1】:

也许转换为日期/时间对象不起作用:

library( lubridate )

data <- read.table( filename, header=TRUE, sep = ";" )

data$date1 <- substr(data$date1,1,16)
data$date1 <- format(data$date1, format="%Y/%m/%d %H:%M")

data$date2 <- substr(data$date2,1,16)
data$date2 <- format(data$date2, format="%d/%m/%Y %H:%M")

类仍然是'字符':

> class(data$date1)
[1] "character"

我做了如下改造:

library( timeDate )

table <- read.table( filename, header=TRUE, sep = ";",
                     colClasses = c( "factor", "numeric", "character", "character" ))

data <- cbind( table[1:2],
               apply( table[3], 2, FUN=function(x){ timeDate(x,format="%Y/%m/%d %H:%M") } ),
               apply( table[4], 2, FUN=function(x){ timeDate(x,format="%d/%m/%Y %H:%M") } ) )

colnames(data) <- colnames(table)

这更详细,但至少我们有时间和日期:

> class(data$date1)
[1] "POSIXct" "POSIXt" 
> (data$date1 <= data$date2 + as.difftime(4*365,units="days")) & (data$date2 <= data$date1 + as.difftime(30,units="days"))
[1]  TRUE  TRUE FALSE FALSE    NA    NA

【讨论】:

    【解决方案2】:

    查看lubridate 库,了解如何处理日期和时间。

    这是使用 lubridate 添加 30 天的方法

    library(lubridate)
    
    ymd('2011-01-01') + days(30)
    [1] "2011-01-31 UTC"
    

    更多信息:

    http://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.html

    【讨论】:

    • 我试图让它与 ymd_hms 一起工作,但它不起作用:> (data$date1)[c(1:5)] "2012/02/08 10:03" "2011 /05/19 09:25" "2011/01/20 11:58" "2010/09/29 12:45" "" > (ymd_hms(data$date1))[c(1:5)] "2020- 12-02 08:10:03 UTC" "2020-11-05 19:09:25 UTC" "2020-11-01 20:11:58 UTC" NA NA
    猜你喜欢
    • 2021-11-26
    • 2017-11-02
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多