[R] diff, POSIXct, POSIXlt, POSIXt
Patrick Giraudoux
patrick.giraudoux at univ-fcomte.fr
Mon Jul 24 07:54:35 CEST 2006
OK. Got it. Thanks a lot everybody.
I however feel that although the problem can be technically handled by
any user aware of it, it should be fixed in R in a more general way,
either by modifying the diff() code so that it really handles any kind
of POSIXt (POSIXlt and POSIXct) with the same final result (as claimed
in the documentation), or mentioning explicitely in de documentation
that diff(), as it is written currently, can handle correctly only
POSIXct (and not any POSIXt or POSIXlt).
There is a kind of danger of wrong output for users (even those reading
the documentation) if things are left as they are, and I have detected
this problem just by chance.
All the best,
Patrick
Gabor Grothendieck a écrit :
> Just one more comment. It is possible to define length.POSIXlt yourself
> in which case diff works with POSIXlt objects.
>
>> length.POSIXlt <- function(x) length(x[[1]])
>> diff(dts)
> Time differences of 91, 92, 183, 91, 92, 182, 91, 92, 182 days
>
>
> On 7/23/06, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
>> Moving this to r-devel.
>>
>> Looking at the diff.POSIXt code we see the problem is that it takes the
>> length of the input using length which is wrong since in the case
>> of POSIXlt the length is always 9 (or maybe length should be
>> defined differently for POSIXlt?). Try this which gives the same
>> problem:
>>
>> dts[-1] - dts[-length(dts)]
>>
>> We get a more sensible answer if length is calculated correctly:
>>
>> dts[-1] - dts[-length(dts[[1]])]
>>
>>
>> On 7/23/06, Patrick Giraudoux <patrick.giraudoux at univ-fcomte.fr> wrote:
>> > > Try converting to POSIXct:
>> > That's what I did finally (see the previous e-mail).
>> >
>> >
>> dts<-c("15/4/2003","15/7/2003","15/10/2003","15/04/2004","15/07/2004","15/10/2004","15/4/2005","15/07/2005","15/10/2005","15/4/2006")
>>
>> >
>> > dts <- as.POSIXct(strptime(dts, "%d/%m/%Y"))
>> > diff(dts)
>> >
>> > Time differences of 91, 92, 183, 91, 92, 182, 91, 92, 182 days
>> >
>> > > What is the problem you are trying to solve?
>> > Actually, I don't understand why using diff() and POSIXct provides the
>> > expected result and not using POSIXlt. Both POSIXct and POSIXlt are of
>> > class POSIXt. The doc of diff() stresses that <'diff' is a generic
>> > function with a default method and ones for classes '"ts"', '"POSIXt"'
>> > and '"Date"'>. It does not mention differences between POSIXct and
>> POSIXlt.
>> >
>> > Moreover, using diff() with POSIXlt has provided (wrong) numbers...
>> and
>> > not an error. This may be difficult to detect sometimes along
>> programme
>> > lines. Must one keep in mind that diff() is reliably applicable
>> only on
>> > POSIXct? In this case, should not it bve mentionned in the
>> documentation?
>> >
>> > All the best,
>> >
>> > Patrick
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > jim holtman a écrit :
>> > > Try converting to POSIXct:
>> > >
>> > > > str(dts)
>> > > 'POSIXlt', format: chr [1:10] "2003-04-15" "2003-07-15" "2003-10-15"
>> > > "2004-04-15" "2004-07-15" "2004-10-15" "2005-04-15" ...
>> > > > dts
>> > > [1] "2003-04-15" "2003-07-15" "2003-10-15" "2004-04-15"
>> "2004-07-15"
>> > > "2004-10-15" "2005-04-15" "2005-07-15"
>> > > [9] "2005-10-15" "2006-04-15"
>> > > > dts <- as.POSIXct(dts)
>> > > > dts
>> > > [1] "2003-04-15 EDT" "2003-07-15 EDT" "2003-10-15 EDT" "2004-04-15
>> > > EDT" "2004-07-15 EDT" "2004-10-15 EDT"
>> > > [7] "2005-04-15 EDT" "2005-07-15 EDT" "2005-10-15 EDT"
>> "2006-04-15 EDT"
>> > > > diff(dts)
>> > > Time differences of 91, 92, 183, 91, 92, 182, 91, 92, 182 days
>> > > >
>> > >
>> > >
>> > >
>> > > On 7/23/06, *Patrick Giraudoux* <patrick.giraudoux at univ-fcomte.fr
>> > > <mailto:patrick.giraudoux at univ-fcomte.fr>> wrote:
>> > >
>> > > Dear Listers,
>> > >
>> > > I have encountered a strange problem using diff() and POSIXt:
>> > >
>> > >
>> dts<-c("15/4/2003","15/7/2003","15/10/2003","15/04/2004","15/07/2004","15/10/2004","15/4/2005","15/07/2005","15/10/2005","15/4/2006")
>>
>> > >
>> > > dts <- strptime(dts, "%d/%m/%Y")
>> > > class(dts)
>> > >
>> > > [1] "POSIXt" "POSIXlt"
>> > >
>> > > diff(dts)
>> > >
>> > > Time differences of 7862400, 7948800, 15811200, 7862400,
>> 7948800,
>> > > 15724800, 7862400, 7948800, 0 secs
>> > >
>> > > In this case the result is not the one expected: expressed in
>> seconds
>> > > and not in days, and the difference between the two last
>> dates is
>> > > not 0.
>> > >
>> > > Now, if one use a vector of 9 dates only (whatever the date
>> removed),
>> > > things come well:
>> > >
>> > > diff(dts[-1])
>> > >
>> > > Time differences of 92, 183, 91, 92, 182, 91, 92, 182 days
>> > >
>> > > Also if one contrains dts to POSIXct
>> > >
>> > >
>> dts<-c("15/4/2003","15/7/2003","15/10/2003","15/04/2004","15/07/2004","15/10/2004","15/4/2005","15/07/2005","15/10/2005","15/4/2006")
>>
>> > >
>> > > dts <- as.POSIXct(strptime(dts, "%d/%m/%Y"))
>> > > diff(dts)
>> > >
>> > > Time differences of 91, 92, 183, 91, 92, 182, 91, 92,
>> 182 days
>> > >
>> > > Any rational in that?
>> > >
>> > > Patrick
>> > >
>> > > ______________________________________________
>> > > R-help at stat.math.ethz.ch <mailto:R-help at stat.math.ethz.ch>
>> 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.
>> > >
>> > >
>> > >
>> > >
>> > > --
>> > > Jim Holtman
>> > > Cincinnati, OH
>> > > +1 513 646 9390
>> > >
>> > > What is the problem you are trying to solve?
>> >
>> > [[alternative HTML version deleted]]
>> >
>> >
>> >
>> > ______________________________________________
>> > R-help at stat.math.ethz.ch 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