代码之家  ›  专栏  ›  技术社区  ›  B. Davis

将年内的日数转换为月/日格式

  •  0
  • B. Davis  · 技术社区  · 8 年前

    我正在尝试将年内的天数转换为月/日格式。

    set.seed(123)
    df1 <- data.frame(Year = rep(15,100), DayNum = seq(78,177,1), Hour = sample(0:23,100,replace = T))
    df2 <- data.frame(Year = rep(16,100), DayNum = seq(78,177,1), Hour = sample(0:23,100,replace = T))
    
    df <- rbind(df1, df2)
    > head(df)
      Year DayNum Hour
    1   15     78    6
    2   15     79   18
    3   15     80    9
    4   15     81   21
    5   15     82   22
    6   15     83    1
    > tail(df)
        Year DayNum Hour
    195   16    172   22
    196   16    173   11
    197   16    174    9
    198   16    175   15
    199   16    176    3
    200   16    177   13
    

    2015年和2016年有100条记录,我如何才能 POSIXct

    虽然有许多相关帖子的起始日期都是儒略日期(通常是1970-01-01),但我找不到任何一年内有天数且年份可变的帖子(即2015年和2016年)。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Dave2e    8 年前

    这个 as.POSIXct 函数可以在从“儒略”日期转换为日期/时间对象时指定起始日期:

    #calculate the origin date based on the year column
    df$origin<-as.Date(paste0("20", df$Year,"-01-01"))
    #convert the Julian day to a date/time object
    as.POSIXct(df$JulianDay, origin=df$origin)
    

    可能需要考虑添加时区选项以实现完整性:

     as.POSIXct(df$JulianDay, origin=df$origin, tz="GMT")
    
        2
  •  1
  •   akuiper    8 年前

    你可能需要这样的东西,使用 %j 指定一年中的哪一天:

    strptime(with(df, paste(Year, DayNum, Hour)), "%y %j %H")
    
    # [1] "2015-03-19 06:00:00 EDT"
    # [2] "2015-03-20 18:00:00 EDT"
    # [3] "2015-03-21 09:00:00 EDT"
    # [4] "2015-03-22 21:00:00 EDT"
    # [5] "2015-03-23 22:00:00 EDT"