[R] Days to solstice calculation

David Carlson dcarlson at tamu.edu
Mon Dec 2 19:47:25 CET 2013


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-bounces at r-project.org
[mailto:r-help-bounces at r-project.org] On Behalf Of White,
William Patrick
Sent: Monday, December 2, 2013 10:32 AM
To: Pascal Oettli
Cc: r-help at 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.oettli at gmail.com <skalp.oettli at gmail.com> on behalf
of Pascal Oettli <kridox at ymail.com>
Sent: Monday, December 2, 2013 2:22 AM
To: White, William Patrick
Cc: r-help at 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.232 at 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 at 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 at 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.



More information about the R-help mailing list