代码之家  ›  专栏  ›  技术社区  ›  Ray Tayek

如何在r中设置日期、月份和年份?

  •  2
  • Ray Tayek  · 技术社区  · 6 年前

    我必须在数据框中确定一个日期。日期显示为“16/12/2006”,时间显示为“17:24:00”我想构造一个包含日期和时间的posixlt我试过:

    fixTime2<-function(date,time) { # replaces the date in time with the parameter date.
        fixed<-time
        fixed$mon<-as.numeric(format(date,"%m"))
        fixed$mday<-as.numeric(format(date,"%d"))
        fixed$year<-as.numeric(format(date,"%Y"))-1900
        return(fixed)
    }
    testFixTime2<-function() {
        date<-as.Date("16/12/2006", format = "%d/%m/%Y")
        str(date)
        time<-strptime("17:24:00","%H:%M:%S")
        str(time)
        fixed<-fixTime2(date,time)
        str(fixed)
        return(fixed)
    }
    

    当我运行程序时,我得到:

    > source("1.R")
    > f<-testFixTime2()
     Date[1:1], format: "2006-12-16"
     POSIXlt[1:1], format: "2018-07-17 17:24:00"
     POSIXlt[1:1], format: "2007-01-16 17:24:00"
    

    一年一休,日、月不正确。

    我试过每月$和每天$但它们似乎也不起作用。

    有没有更简单的方法来构造posixlt?

    感谢

    我最后得到了:

    require(RUnit)
    fixTime<-function(date,time) { # replaces the date in time with the paramer date.
        as.POSIXlt(sprintf("%s %s",date,time),format="%d/%m/%Y %H:%M:%S")
    }
    fixTime2<-function(month,day,year,hours,minutes,seconds) {
        print("in function fixTime")
        print(year)
        date<-paste0(c(day,month,year),collapse="/")
        time<-paste0(c(hours,minutes,seconds),collapse=":")
        fixed<-fixTime(date,time)
    }
    test.fixTime<-function() {
        month<-"12"
        day<-"16"
        year<-"2006"
        hours<-"17"
        minutes<-"24"
        seconds<-"00"
        print(year)
        fixTime2(month,day,year,hours,minutes,seconds)
        #fixed<-fixTime(date,time)
        checkEquals(as.numeric(month),fixed$mon+1)
        checkEquals(as.numeric(day),fixed$mday)
        checkEquals(as.numeric(year),fixed$year+1900)
        checkEquals(as.numeric(hours),fixed$hour)
        checkEquals(as.numeric(minutes),fixed$min)
        checkEquals(as.numeric(seconds),fixed$sec)
    }
    

    这是一门课程的家庭作业。

    1 回复  |  直到 6 年前
        1
  •  0
  •   r2evans    6 年前

    如果你有单独的字符串,那么

    as.POSIXlt(paste(date, time), format="%d/%m/%Y %H:%M:%S")
    

    应该有用。例子:

    as.POSIXlt(paste("16/12/2006", "17:24:00"), format="%d/%m/%Y %H:%M:%S")
    # [1] "2006-12-16 17:24:00"
    

    第二点, $month $day 不可用的属性您可以看到以下属性:

    dput(as.POSIXlt(Sys.time()))
    # structure(list(sec = 48.7993450164795, min = 17L, hour = 0L, 
    #     mday = 18L, mon = 6L, year = 118L, wday = 3L, yday = 198L, 
    #     isdst = 1L, zone = "PDT", gmtoff = -25200L), .Names = c("sec", 
    # "min", "hour", "mday", "mon", "year", "wday", "yday", "isdst", 
    # "zone", "gmtoff"), class = c("POSIXlt", "POSIXt"), tzone = c("", 
    # "PST", "PDT"))
    

    表明你真正需要的是 $mon $mday .