Search code examples
rtimetimestampdatetime-conversion

Converting Navy sunset/sunrise data into time


I have downloaded the 2015-2017 sunset/sunrise data from the Navy and I am trying to format it into dates and time to further use with other data I have. This is how my data set looks in R.

R screenshot

I have managed to convert the date into the right R data format. Yet, I still can't convert my rise/set column data from a number/integer format to a time data (as hh:mm).
Based on one internet source, I wrote the following codes:

Sun2015$Srise<- format(strptime(Sun2015$Rise, format="%H:%M")) 

However this gives NA in my data

OR

Sun2015$Srise<-str_pad(Sun2015$Rise, 4, pad="0")

Sun2015$Srise<-hour(hm(Sun2015$Srise))

Yet, I received the following error:

Warning message: In .parse_hms(..., order = "HM", quiet = quiet) :
Some strings failed to parse.

Is there a better way to convert the columns into the right time format so that I can merge the date and time columns into date-time columns for sunset and sunrise? Thank you in advance for your help.


Solution

  • You can convert your military time to 2400 time strings using sprint("%04d", data) and go from there. For example, with the first 5 lines of your data:

    # Sample of your data
    Day <- c("1/1/2015", "1/2/2015", "1/3/2015", "1/4/2015", "1/5/2015")
    Rise <- c(652,652,652,653,653)
    Set <- c(1755,1756,1756,1757,1757)
    
    sun2015 <- data.frame(Day, Rise, Set)
    
    # Convert to 2400 style strings with leading zeroes where necessary
    sun2015$Rise <- sprintf("%04d", sun2015$Rise)
    sun2015$Set <- sprintf("%04d", sun2015$Set)
    
    # Merge with your date
    sun2015$day_rise <- as.POSIXct(paste0(sun2015$Day, " ",sun2015$Rise), format = "%m/%d/%Y %H%M", origin = "1970-01-01", tz = "UTC")
    sun2015$day_set <- as.POSIXct(paste0(sun2015$Day, " ",sun2015$Set), format = "%m/%d/%Y %H%M", origin = "1970-01-01", tz = "UTC")
    
    > sun2015$day_rise
    [1] "2015-01-01 06:52:00 UTC" "2015-01-02 06:52:00 UTC" "2015-01-03 06:52:00 UTC" "2015-01-04 06:53:00 UTC"
    [5] "2015-01-05 06:53:00 UTC"
    > sun2015$day_set
    [1] "2015-01-01 17:55:00 UTC" "2015-01-02 17:56:00 UTC" "2015-01-03 17:56:00 UTC" "2015-01-04 17:57:00 UTC"
    [5] "2015-01-05 17:57:00 UTC"
    

    You can adjust to the appropriate time zone if necessary.