I am trying to extract only the winters (defined to be 01-Dec through
28-Feb) of daily data from 1948-2002. There are 90 days in each winter
season. I wrote the following code to gather the winter dates into a
single vector:
DJF <- NULL
for(year in 1949:1999) {
temp.begin <- strptime(paste("01/12", year-1, sep="/"),
"%d/%m/%Y")
temp.end <- strptime(paste("28/02", year, sep="/"),
"%d/%m/%Y")
## Gives wrong answer:
temp.seq <- seq(temp.begin, temp.end, by="day")
if(is.null(DJF))
DJF <- temp.seq
else
DJF <- c(DJF, temp.seq)
cat("Winter:", year, "\t", length(temp.seq),
"\n")
}
with the following output:
Winter: 1949 90
Winter: 1950 90
Winter: 1951 90
Winter: 1952 90
Winter: 1953 90
Winter: 1954 90
Winter: 1955 90
Winter: 1956 90
Winter: 1957 90
Winter: 1958 90
Winter: 1959 90
Winter: 1960 90
Winter: 1961 90
Winter: 1962 90
Winter: 1963 90
Winter: 1964 90
Winter: 1965 90
Winter: 1966 90
Winter: 1967 90
Winter: 1968 90
Winter: 1969 90
Winter: 1970 90
Winter: 1971 90
Winter: 1972 90
Winter: 1973 90
Winter: 1974 89
Winter: 1975 89
Winter: 1976 90
Winter: 1977 90
Winter: 1978 90
Winter: 1979 90
Winter: 1980 90
Winter: 1981 90
Winter: 1982 90
Winter: 1983 90
Winter: 1984 90
Winter: 1985 90
Winter: 1986 90
Winter: 1987 90
Winter: 1988 90
Winter: 1989 90
Winter: 1990 90
Winter: 1991 90
Winter: 1992 90
Winter: 1993 90
Winter: 1994 90
Winter: 1995 90
Winter: 1996 90
Winter: 1997 90
Winter: 1998 90
Winter: 1999 90
Winter: 2000 90
Winter: 2001 90
Winter: 2002 90
There are two years, 1974 and 1975, that produce only 89 days per winter.
I could not figure out what the cause of this was, but a workaround is two
rewrite the call to seq.POSIXt as:
temp.seq <- seq(temp.begin, length.out=90, by="day")
I am unsure why one works and one does not. Any ideas?
Brandon
----------------------------------------------------------------------------
Geophysical Statistics Project
National Center for Atmospheric Research +1 303 497 1709 voice
P.O. Box 3000, Boulder, CO 80307-3000 +1 303 497 1333 fax
whitcher at ucar.edu www.cgd.ucar.edu/~whitcher/
----------------------------------------------------------------------------
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at
stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Nothing jumps out at me, I'm sorry to say.
But in the meantime, I am wondering if it wouldn't be easier to
extract only the
winters with something like
datevec[format(datevec,'%m') %in%
c('12','01','02') &
format(datevec,'%m-%d' != '02-29']
where datevec is the vector of days associated with your data, as an
object of class POSIXct or POSIXlt.
Then use something like
table(format(datevec,'%Y'))
to check that you have 90 of each.
-Don
At 3:27 PM -0600 5/31/02, Brandon Whitcher wrote:>I am trying to extract only the winters (defined to be 01-Dec through
>28-Feb) of daily data from 1948-2002. There are 90 days in each winter
>season. I wrote the following code to gather the winter dates into a
>single vector:
>
>DJF <- NULL
>for(year in 1949:1999) {
> temp.begin <- strptime(paste("01/12", year-1,
sep="/"), "%d/%m/%Y")
> temp.end <- strptime(paste("28/02", year,
sep="/"), "%d/%m/%Y")
> ## Gives wrong answer:
> temp.seq <- seq(temp.begin, temp.end, by="day")
> if(is.null(DJF))
> DJF <- temp.seq
> else
> DJF <- c(DJF, temp.seq)
> cat("Winter:", year, "\t", length(temp.seq),
"\n")
>}
>
>with the following output:
>
>Winter: 1949 90
>Winter: 1950 90
>Winter: 1951 90
>Winter: 1952 90
>Winter: 1953 90
>Winter: 1954 90
>Winter: 1955 90
>Winter: 1956 90
>Winter: 1957 90
>Winter: 1958 90
>Winter: 1959 90
>Winter: 1960 90
>Winter: 1961 90
>Winter: 1962 90
>Winter: 1963 90
>Winter: 1964 90
>Winter: 1965 90
>Winter: 1966 90
>Winter: 1967 90
>Winter: 1968 90
>Winter: 1969 90
>Winter: 1970 90
>Winter: 1971 90
>Winter: 1972 90
>Winter: 1973 90
>Winter: 1974 89
>Winter: 1975 89
>Winter: 1976 90
>Winter: 1977 90
>Winter: 1978 90
>Winter: 1979 90
>Winter: 1980 90
>Winter: 1981 90
>Winter: 1982 90
>Winter: 1983 90
>Winter: 1984 90
>Winter: 1985 90
>Winter: 1986 90
>Winter: 1987 90
>Winter: 1988 90
>Winter: 1989 90
>Winter: 1990 90
>Winter: 1991 90
>Winter: 1992 90
>Winter: 1993 90
>Winter: 1994 90
>Winter: 1995 90
>Winter: 1996 90
>Winter: 1997 90
>Winter: 1998 90
>Winter: 1999 90
>Winter: 2000 90
>Winter: 2001 90
>Winter: 2002 90
>
>There are two years, 1974 and 1975, that produce only 89 days per winter.
>I could not figure out what the cause of this was, but a workaround is two
>rewrite the call to seq.POSIXt as:
>
>temp.seq <- seq(temp.begin, length.out=90, by="day")
>
>I am unsure why one works and one does not. Any ideas?
>
>Brandon
>
>----------------------------------------------------------------------------
> Geophysical Statistics Project
> National Center for Atmospheric Research +1 303 497 1709 voice
> P.O. Box 3000, Boulder, CO 80307-3000 +1 303 497 1333 fax
>
> whitcher at ucar.edu
www.cgd.ucar.edu/~whitcher/
>----------------------------------------------------------------------------
>
>
>
>
>
>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
>r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
>Send "info", "help", or "[un]subscribe"
>(in the "body", not the subject !) To: r-help-request at
stat.math.ethz.ch
>_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
--
--------------------------------------
Don MacQueen
Environmental Protection Department
Lawrence Livermore National Laboratory
Livermore, CA, USA
--------------------------------------
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at
stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Brandon,
Here is the explanation.
Think in terms of two different definitions of "day":
(1) an interval of 24 hours, and
(2) the interval from one day to the same time the next day.
These are identical, except for two days each year in time zones
where an adjustment is made for the summer months. Then, (2) is 23
hours when the interval includes the transition to summer time, and
25 when it includes the transition back.
by='day' in seq.POSIXt() uses definition (1)
by='DSTday' uses definition (2) (only available in R >= version
1.5.0).
temp.begin is in standard time. In 1974 and 1975, temp.end is in
summer time, and so is one hour short of the 90th day, causing
seq.POSIXt to return only 89 days. The other years, temp.end is also
in standard time, so temp.end and temp.begin are an integer multiple
of 24 hours apart.
I suggest using
seq(temp.begin, length.out=90, by="DSTday")
instead of
seq(temp.begin, length.out=90, by="day")
study the output of the code below to see why.
for(year in 1973:1976) {
temp.begin <- ISOdatetime(year-1,12,1,0,0,0)
temp.end <- ISOdatetime(year,2,28,0,0,0)
ts1 <- seq(temp.begin, temp.end, by="day")
ts2 <- seq(temp.begin, length.out=90, by="day")
ts3 <- seq(temp.begin, length.out=90, by="DSTday")
cat(
format(temp.end,'%Y-%m-%d %H:%M %Z'),
format(max(ts1),'%Y-%m-%d %H:%M %Z'),
format(max(ts2),'%Y-%m-%d %H:%M %Z'),
format(max(ts3),'%Y-%m-%d %H:%M %Z'),
length(ts1),
length(ts2),
length(ts3),
difftime(max(ts1),ts1[1],units='h'),
difftime(max(ts2),ts2[1],units='h'),
difftime(max(ts3),ts3[1],units='h'),
(as.numeric(temp.end)-as.numeric(temp.begin))/(24*60*60),
"\n")
}
In case anyone reading Brandon's first message thought he had found a
bug, I have to say, no this is not a bug. The transitions to and from
daylight savings time (to use the American misnomer) are like a
minefield waiting to trip the unwary--and I have been caught by them
many times.
-Don
At 3:27 PM -0600 5/31/02, Brandon Whitcher wrote:>I am trying to extract only the winters (defined to be 01-Dec through
>28-Feb) of daily data from 1948-2002. There are 90 days in each winter
>season. I wrote the following code to gather the winter dates into a
>single vector:
>
>DJF <- NULL
>for(year in 1949:1999) {
> temp.begin <- strptime(paste("01/12", year-1,
sep="/"), "%d/%m/%Y")
> temp.end <- strptime(paste("28/02", year,
sep="/"), "%d/%m/%Y")
> ## Gives wrong answer:
> temp.seq <- seq(temp.begin, temp.end, by="day")
> if(is.null(DJF))
> DJF <- temp.seq
> else
> DJF <- c(DJF, temp.seq)
> cat("Winter:", year, "\t", length(temp.seq),
"\n")
>}
>
>with the following output:
>
>Winter: 1949 90
>Winter: 1950 90
>Winter: 1951 90
>Winter: 1952 90
>Winter: 1953 90
>Winter: 1954 90
>Winter: 1955 90
>Winter: 1956 90
>Winter: 1957 90
>Winter: 1958 90
>Winter: 1959 90
>Winter: 1960 90
>Winter: 1961 90
>Winter: 1962 90
>Winter: 1963 90
>Winter: 1964 90
>Winter: 1965 90
>Winter: 1966 90
>Winter: 1967 90
>Winter: 1968 90
>Winter: 1969 90
>Winter: 1970 90
>Winter: 1971 90
>Winter: 1972 90
>Winter: 1973 90
>Winter: 1974 89
>Winter: 1975 89
>Winter: 1976 90
>Winter: 1977 90
>Winter: 1978 90
>Winter: 1979 90
>Winter: 1980 90
>Winter: 1981 90
>Winter: 1982 90
>Winter: 1983 90
>Winter: 1984 90
>Winter: 1985 90
>Winter: 1986 90
>Winter: 1987 90
>Winter: 1988 90
>Winter: 1989 90
>Winter: 1990 90
>Winter: 1991 90
>Winter: 1992 90
>Winter: 1993 90
>Winter: 1994 90
>Winter: 1995 90
>Winter: 1996 90
>Winter: 1997 90
>Winter: 1998 90
>Winter: 1999 90
>Winter: 2000 90
>Winter: 2001 90
>Winter: 2002 90
>
>There are two years, 1974 and 1975, that produce only 89 days per winter.
>I could not figure out what the cause of this was, but a workaround is two
>rewrite the call to seq.POSIXt as:
>
>temp.seq <- seq(temp.begin, length.out=90, by="day")
>
>I am unsure why one works and one does not. Any ideas?
>
>Brandon
>
>----------------------------------------------------------------------------
> Geophysical Statistics Project
> National Center for Atmospheric Research +1 303 497 1709 voice
> P.O. Box 3000, Boulder, CO 80307-3000 +1 303 497 1333 fax
>
> whitcher at ucar.edu
www.cgd.ucar.edu/~whitcher/
>----------------------------------------------------------------------------
>
>
>
>
>
>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
>r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
>Send "info", "help", or "[un]subscribe"
>(in the "body", not the subject !) To: r-help-request at
stat.math.ethz.ch
>_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
--
--------------------------------------
Don MacQueen
Environmental Protection Department
Lawrence Livermore National Laboratory
Livermore, CA, USA
--------------------------------------
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at
stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Maybe Matching Threads
- Help with a loop
- n Realizations of a Stochastic Process assigned to dynamically generated variable names?
- vector a partir de los valores de una tabla
- Subsetting a zooreg object using window / subset
- how to optimise cross-correlation plot to study time lag between time-series?