Re: [R] POSIXlt converted to POSIXct in as.data.frame()
Thank you, Spencer. It *does* depend on the exact environment such as timezone, locale, ??? In my (Linux) setup, I can reproduce Rogers' 1-off problem using exactly your (Spencer's) R script. Carefully considering the warning in ?POSIXlt, and using Sys.getenv(TZ) to see that I had no timezone set, I've used Sys.putenv(TZ = MET) to correctly set my timezone, but that still did not help, so I tried Sys.putenv(TZ = UTC+1) and that *did* solve the problem. Interestingly, even Sys.putenv(TZ = ) does solve the problem for me. Here is small function, derived from your codes, which is useful for testing these settings: tstD - function(x.Plt = strptime(paste(9:13, Nov 2006), format=%d %b %Y)) { ## Purpose: Check POSIXlt - Dataframe (i.e. - POSIXct) - Date conversion ## -- ## Arguments: x.Plt: a correct POSIXlt object ## -- ## Author: Martin Maechler, Date: 15 Nov 2006, 10:16 stopifnot(inherits(x.Plt, POSIXlt)) d0 - as.Date(x.Plt) if(isTRUE(getOption(verbose))) { cat(as.Date(*): ); str(d0) } dd - data.frame(x.Plt) ## - column converted to P..ct -- definitely needed and desired dDate - as.Date(dd[,x.Plt]) stopifnot(dDate - d0 == 0) ## else OK } SpG == Spencer Graves [EMAIL PROTECTED] on Sun, 12 Nov 2006 08:26:09 -0800 writes: SpG I'm not qualified to say much about POSIX, but I haven't seen a SpG reply to this in almost 3 days, so I'll offer a comment in the hopes SpG that it might be useful or that someone else might correct any SpG misstatement I might make: SpG First, I didn't find a discrepancy. sessionInfo() SpG R version 2.4.0 (2006-10-03) SpG i386-pc-mingw32 SpG locale: SpG LC_COLLATE=English_United States.1252;LC_CTYPE=English_United SpG States.1252;LC_MONETARY=English_United SpG States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252 SpG attached base packages: SpG [1] methods stats graphics grDevices utils datasets SpG [7] base SpG I used the following modification extension of your example: SpG my_POSIXlt - strptime(c(11-09-2006, 11-10-2006, 11-11-2006, SpG11-12-2006, 11-13-2006), %m-%d-%Y) SpG str(my_POSIXlt) SpG class(my_POSIXlt) SpG my_Date - as.Date(my_POSIXlt) SpG str(my_Date) SpG myCharacters - format(my_Date) SpG class(myCharacters) SpG my_DF - data.frame(my_POSIXlt) SpG str(my_DF) SpG DF_Date - as.Date(my_DF$my_POSIXlt) SpG str(DF_Date) SpG DF_Date SpG all.equal(DF_Date, my_Date) SpG # TRUE SpG The data.frame function converts POSIXlt, which is a list, to SpG POSIXct, which is a numeric vector with attributes: attributes(my_DF$my_POSIXlt) SpG $class SpG [1] POSIXt POSIXct SpG $tzone SpG [1] is.numeric(my_DF$my_POSIXlt) SpG [1] TRUE SpG If you are getting a day shift, I would guess that you might have SpG a different version of some of the software or a difference in your SpG locale. I just did 'update.packages()' yesterday, so if I'm out of date SpG on something, I hope someone will help me understand and fix the problem. SpG Beyond this, have you reviewed the ?POSIXt help file plus Gabor SpG Grothendieck and Thomas Petzoldt. R help desk: Date and time classes in SpG R. R News, 4(1):29-32, June 2004 (available from www.r-project.org - SpG Newsletter)? SpG Hope this helps. SpG Spencer Graves SpG Roger Bivand wrote: In trying to use as.Date(), I've come across the conversion of POSIXlt to POSIXct when a POSIXlt variable is included in a data frame: my_POSIX - strptime(c(11-09-2006, 11-10-2006, 11-11-2006, 11-12-2006, 11-13-2006), %m-%d-%Y) str(my_POSIX) my_Date - as.Date(my_POSIX) str(my_Date) data - format(my_Date) str(data) my_DF - data.frame(my_POSIX) str(my_DF) DF_Date - as.Date(my_DF$my_POSIX) str(DF_Date) DF_Date The consequence (for my LC_TIME and machine time zone) is that when as.Date() is applied to the data frame column, it dispatches on as.Date.POSIXct() not as.Date.POSIXlt(), causing a day shift (actually 60 minutes, but because as.Date.POSIXct() says floor(), it ends up being a whole day). Should data.frame() be changing POSIXlt to POSIXct? Yes, that was at least a main idea of POSIXct: it can be dealt with like a numeric vector and hence fits ideally into a data frame. As as.data.frame.POSIXlt() is written, it says: as.data.frame.POSIXlt function (x, row.names = NULL, optional = FALSE, ...) { value - as.data.frame.POSIXct(as.POSIXct(x), row.names, optional, ...) if (!optional) names(value) -
Re: [R] POSIXlt converted to POSIXct in as.data.frame()
I'm not qualified to say much about POSIX, but I haven't seen a reply to this in almost 3 days, so I'll offer a comment in the hopes that it might be useful or that someone else might correct any misstatement I might make: First, I didn't find a discrepancy. sessionInfo() R version 2.4.0 (2006-10-03) i386-pc-mingw32 locale: LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252 attached base packages: [1] methods stats graphics grDevices utils datasets [7] base I used the following modification extension of your example: my_POSIXlt - strptime(c(11-09-2006, 11-10-2006, 11-11-2006, 11-12-2006, 11-13-2006), %m-%d-%Y) str(my_POSIXlt) class(my_POSIXlt) my_Date - as.Date(my_POSIXlt) str(my_Date) myCharacters - format(my_Date) class(myCharacters) my_DF - data.frame(my_POSIXlt) str(my_DF) DF_Date - as.Date(my_DF$my_POSIXlt) str(DF_Date) DF_Date all.equal(DF_Date, my_Date) # TRUE The data.frame function converts POSIXlt, which is a list, to POSIXct, which is a numeric vector with attributes: attributes(my_DF$my_POSIXlt) $class [1] POSIXt POSIXct $tzone [1] is.numeric(my_DF$my_POSIXlt) [1] TRUE If you are getting a day shift, I would guess that you might have a different version of some of the software or a difference in your locale. I just did 'update.packages()' yesterday, so if I'm out of date on something, I hope someone will help me understand and fix the problem. Beyond this, have you reviewed the ?POSIXt help file plus Gabor Grothendieck and Thomas Petzoldt. R help desk: Date and time classes in R. R News, 4(1):29-32, June 2004 (available from www.r-project.org - Newsletter)? Hope this helps. Spencer Graves Roger Bivand wrote: In trying to use as.Date(), I've come across the conversion of POSIXlt to POSIXct when a POSIXlt variable is included in a data frame: my_POSIX - strptime(c(11-09-2006, 11-10-2006, 11-11-2006, 11-12-2006, 11-13-2006), %m-%d-%Y) str(my_POSIX) my_Date - as.Date(my_POSIX) str(my_Date) data - format(my_Date) str(data) my_DF - data.frame(my_POSIX) str(my_DF) DF_Date - as.Date(my_DF$my_POSIX) str(DF_Date) DF_Date The consequence (for my LC_TIME and machine time zone) is that when as.Date() is applied to the data frame column, it dispatches on as.Date.POSIXct() not as.Date.POSIXlt(), causing a day shift (actually 60 minutes, but because as.Date.POSIXct() says floor(), it ends up being a whole day). Should data.frame() be changing POSIXlt to POSIXct? As as.data.frame.POSIXlt() is written, it says: as.data.frame.POSIXlt function (x, row.names = NULL, optional = FALSE, ...) { value - as.data.frame.POSIXct(as.POSIXct(x), row.names, optional, ...) if (!optional) names(value) - deparse(substitute(x))[[1]] value } environment: namespace:base which seems a little brutal. Using I() seems to be a work-around: my_DF - data.frame(my_POSIXa=I(my_POSIX)) str(my_DF) class(my_DF$my_POSIXa) DF_Date - as.Date(my_DF$my_POSIXa) str(DF_Date) DF_Date In the original problem (conversion of a list read from PostgreSQL to a data frame with as.data.frame()), having to know that you need to insert I() is perhaps unexpected. Roger __ R-help@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.
[R] POSIXlt converted to POSIXct in as.data.frame()
In trying to use as.Date(), I've come across the conversion of POSIXlt to POSIXct when a POSIXlt variable is included in a data frame: my_POSIX - strptime(c(11-09-2006, 11-10-2006, 11-11-2006, 11-12-2006, 11-13-2006), %m-%d-%Y) str(my_POSIX) my_Date - as.Date(my_POSIX) str(my_Date) data - format(my_Date) str(data) my_DF - data.frame(my_POSIX) str(my_DF) DF_Date - as.Date(my_DF$my_POSIX) str(DF_Date) DF_Date The consequence (for my LC_TIME and machine time zone) is that when as.Date() is applied to the data frame column, it dispatches on as.Date.POSIXct() not as.Date.POSIXlt(), causing a day shift (actually 60 minutes, but because as.Date.POSIXct() says floor(), it ends up being a whole day). Should data.frame() be changing POSIXlt to POSIXct? As as.data.frame.POSIXlt() is written, it says: as.data.frame.POSIXlt function (x, row.names = NULL, optional = FALSE, ...) { value - as.data.frame.POSIXct(as.POSIXct(x), row.names, optional, ...) if (!optional) names(value) - deparse(substitute(x))[[1]] value } environment: namespace:base which seems a little brutal. Using I() seems to be a work-around: my_DF - data.frame(my_POSIXa=I(my_POSIX)) str(my_DF) class(my_DF$my_POSIXa) DF_Date - as.Date(my_DF$my_POSIXa) str(DF_Date) DF_Date In the original problem (conversion of a list read from PostgreSQL to a data frame with as.data.frame()), having to know that you need to insert I() is perhaps unexpected. Roger -- Roger Bivand Economic Geography Section, Department of Economics, Norwegian School of Economics and Business Administration, Helleveien 30, N-5045 Bergen, Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43 e-mail: [EMAIL PROTECTED] __ R-help@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.