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.

Reply via email to