They are a day apart. Summer solstice is day 172 in both cases so the calendar dates should be one day apart and they are (June 22 in 2007 and June 21 in 2008):
> strptime("2007-06-22", format="%Y-%m-%d")$yday [1] 172 > strptime("2008-06-21", format="%Y-%m-%d")$yday [1] 172 Your Daylength() function gives the same values for days 1-365. So it will always give 172 as the summer solstice and 355 as the winter solstice. The leap year just adds a calculation for day 366. No need to calculate them over and over. ------------------------------------- David L Carlson Department of Anthropology Texas A&M University College Station, TX 77840-4352 -----Original Message----- From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On Behalf Of White, William Patrick Sent: Monday, December 2, 2013 10:32 AM To: Pascal Oettli Cc: r-help@R-project.org Subject: Re: [R] Days to solstice calculation Thank you for your response. I looked at the insol package and it does seem to contain a daylength function, but it would be more informative and aid in my growth as an R user to trace the source of the current problem rather than use a package as a work around. Understanding that an alternate solution exists and understanding why the alternate solution works are not the same thing in this case. ________________________________________ From: skalp.oet...@gmail.com <skalp.oet...@gmail.com> on behalf of Pascal Oettli <kri...@ymail.com> Sent: Monday, December 2, 2013 2:22 AM To: White, William Patrick Cc: r-help@R-project.org Subject: Re: [R] Days to solstice calculation Hello, It seems that this kind of calculations are done in package 'insol'. Regards, Pascal On 2 December 2013 15:26, White, William Patrick <white....@wright.edu> wrote: > Hello, > I've come across a problem in developing a set of custom functions to calculate the number of hours of daylight at a given latitude, and the number of days a date precedes or secedes the summer solstice. I discovered an inconsistency concerning leap years between my derived values and those from the US naval databases. It seems as far as I can figure that my inconsistency arises either in the calculation I used derived from an ecological modeling study in the 90's, in my understanding of the way R itself handles dates, or in my code. I feel like I must be missing something fundamental here and could use a little guidance. The first function returns the hours of daylight given a latitude, and the Julian day of the year (ie Jan 1 = 1 and so on). This appears to be very accurate. The second function takes a given date, extracts the year, determines the number of days in it, and uses the first function to calculate the hours of daylight in each day, and returns the longest or ! sh! > ortest one (Summer or Winter Solstice). But, in the case of leap years and non leap years, the date returned is identical, as is evidenced by Jan 1 in the provided examples being 170 days from summer solstice in both 2008 and 2007. This was not the case, the solstice should vary by one day between these years. Code is provided below and any help is appreciated. > Patrick > ps. apologies to you southern ducks your summer and winter solstices are reversed of my code nomenclature. I'm working with a northern dataset. > > Daylength <- function(J,L){ > #Amount of daylight > #Ecological Modeling, volume 80 (1995) pp. 87-95, "A Model Comparison for Daylength as a Function of Latitude and Day of the Year." > #D = Daylight length > #L = Latitude in Degrees > #J = Day of the year (Julian) > P <- asin(.39795*cos(.2163108 + 2*atan(.9671396*tan(.00860*(J-186))))) > A <- sin(0.8333*pi/180)+sin(L*pi/180)*sin(P) > B <- cos(L*pi/180)*cos(P) > D <- 24 - (24/pi)* acos(A/B) > return(D) > } > > #Example today and here > Daylength(2,39.7505) > > TillSolstice <- function(date,solstice){ > Yr <- as.POSIXlt(date)$year+1900 > a <- as.Date(paste(as.character(Yr),as.character(rep("-01-01", length(Yr))),sep = "")) > b <- as.Date(paste(as.character(Yr),as.character(rep("-12-31", length(Yr))),sep = "")) > Winter <- NA > Summer <- NA > for (g in 1: length(a)){ > if(is.na(a[g])== FALSE){ > if(is.na(b[g])== FALSE){ > cc <- seq.int(a[g],b[g], by = '1 day') > d <- length(cc) > e <- strptime(cc, "%Y-%m-%d")$yday+2 > f <- Daylength(e,39.6981478) > Winter[g] <- which.min(f) > Summer[g] <- which.max(f) > } > } > if(is.na(a[g])== TRUE){ > Winter[g] <- NA > Summer[g] <- NA > } > if(is.na(b[g])== TRUE){ > Winter[g] <- NA > Summer[g] <- NA > } > > > } > #Days until solstice > if (solstice =='S'){Countdown <- Summer - (strptime(date, "%Y-%m-%d")$yday+2)} > if (solstice =='W'){Countdown <- Winter - (strptime(a, "%Y-%m-%d")$yday+2)} > return(Countdown) > } > > Nonleap <- TillSolstice(seq(as.Date("2007/1/1"), as.Date("2007/12/31"), by = "1 day"), solstice = 'S') > Leap <- TillSolstice(seq(as.Date("2008/1/1"), as.Date("2008/12/31"), by = "1 day"), solstice = 'S') > head(Nonleap) > tail(Nonleap) > length(Nonleap) > head(Leap) > tail(Leap) > length(Leap) > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. -- Pascal Oettli Project Scientist JAMSTEC Yokohama, Japan ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.