Bug 14208 - bug in cut.POSIXt (with patch)
bug in cut.POSIXt (with patch)
Status: CLOSED FIXED
Product: R
Classification: Unclassified
Component: Misc
old
ix86 (32-bit) Windows 32-bit
: P5 normal
Assigned To: Jitterbug compatibility account
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2010-02-09 01:26 UTC by Jitterbug compatibility account
Modified: 2010-02-09 03:20 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jitterbug compatibility account 2010-02-09 01:26:45 UTC
From: Brian Diggs <diggsb@ohsu.edu>
Summary:

For certain well formed inputs, cut.POSIXt will give an error.

Example:

cut(as.POSIXct("2009-11-01 04:00:00", tz="America/Los_Angeles"), "1 day")

Example output:

Error in seq.int(0, to - from, by) : 'to' must be finite

Patch to fix error:

This patch is for src/library/base/R/datetime.R

Index: datetime.R
===================================================================
--- datetime.R	(revision 51110)
+++ datetime.R	(working copy)
@@ -729,7 +729,7 @@
 	incr <- 1
 	if(valid > 1L) { start$sec <- 0L; incr <- 59.99 }
 	if(valid > 2L) { start$min <- 0L; incr <- 3600 - 1 }
-	if(valid > 3L) { start$hour <- 0L; incr <- 86400 - 1 }
+	if(valid > 3L) { start$hour <- 0L; start$isdst <- -1L; incr <- 86400 - 1 }
 	if(valid == 5L) { # weeks
 	    start$mday <- start$mday - start$wday
 	    if(start.on.monday)

Discussion/description:

The bug is triggered when the (earliest) date/time given to cut.POSIXt 
falls on the day transitioning from daylight savings time to standard 
time, but at a time after the switchover.  In the US, November 1, 2009 was
such a day.

In cut.POSIXt(), the elements of a POSIXlt representation of the starting 
date/time are directly manipulated to set it to the start of the day 
(since a day sized spacing was requested).  This puts it before the daylight 
savings time to standard time switchover.  When as.POSIXct is later called 
on this object, it returns NA which causes the returned error when the NA 
is passed as an argument to seq.int().

The motivation for the patch is the trunc.POSIXt function in the same 
file.  It correctly handles this case:

trunc(as.POSIXct("2009-11-01 04:00:00", tz="America/Los_Angeles"), "day")
# [1] "2009-11-01 America/Los_Angeles"
as.POSIXct(trunc(as.POSIXct("2009-11-01 04:00:00", tz="America/Los_Angeles"), "day"))
# [1] "2009-11-01 PDT"

In that function, when truncating to days, the isdst element of the POSIXlt
is set to -1L.  That is the modification to cut.POSIXt() that I made.

--
Brian Diggs, Ph.D.
Senior Research Associate, Department of Surgery, Oregon Health & Science University

--please do not edit the information below--

Version:
 platform = i386-pc-mingw32
 arch = i386
 os = mingw32
 system = i386, mingw32
 status = 
 major = 2
 minor = 10.1
 year = 2009
 month = 12
 day = 14
 svn rev = 50720
 language = R
 version.string = R version 2.10.1 (2009-12-14)

Windows XP (build 2600) Service Pack 3

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

Search Path:
 .GlobalEnv, package:stats, package:graphics, package:grDevices, package:utils, package:datasets, package:methods, Autoloads, package:base



Comment 1 Jitterbug compatibility account 2010-02-09 02:40:57 UTC
From: Brian Diggs <diggsb@ohsu.edu>
I do not know why my bug report got so oddly encoded, I've reproduced it; hopefully it won't get mangled again.

Summary:

For certain well formed inputs, cut.POSIXt will give an error.

Example:

cut(as.POSIXct("2009-11-01 04:00:00", tz="America/Los_Angeles"), "1 day")

Example output:

Error in seq.int(0, to - from, by) : 'to' must be finite

Patch to fix error:

This patch is for src/library/base/R/datetime.R

Index: datetime.R
===================================================================
--- datetime.R	(revision 51110)
+++ datetime.R	(working copy)
@@ -729,7 +729,7 @@
 	incr <- 1
 	if(valid > 1L) { start$sec <- 0L; incr <- 59.99 }
 	if(valid > 2L) { start$min <- 0L; incr <- 3600 - 1 }
-	if(valid > 3L) { start$hour <- 0L; incr <- 86400 - 1 }
+	if(valid > 3L) { start$hour <- 0L; start$isdst <- -1L; incr <- 86400 - 1 }
 	if(valid == 5L) { # weeks
 	    start$mday <- start$mday - start$wday
 	    if(start.on.monday)

Discussion:

The bug is triggered when the (earliest) date/time given to cut.POSIXt 
falls on the day transitioning from daylight savings time to standard 
time, but at a time after the switchover.  In the US, November 1, 2009 was
such a day.

In cut.POSIXt(), the elements of a POSIXlt representation of the date/time 
are directly manipulated to set it to the start of the day (since a day
sized spacing was requested).  This puts it before the daylight savings
time to standard time switchover.  When as.POSIXct is later called on this
object, it returns NA which causes the returned error when the NA is passed
as an argument to seq.int().

The motivation for the patch is the trunc.POSIXt function in the same 
file.  It correctly handles this case:

trunc(as.POSIXct("2009-11-01 04:00:00", tz="America/Los_Angeles"), "day")
# [1] "2009-11-01 America/Los_Angeles"
as.POSIXct(trunc(as.POSIXct("2009-11-01 04:00:00", tz="America/Los_Angeles"), "day"))
# [1] "2009-11-01 PDT"

In that function, when truncating to days, the isdst element of the POSIXlt
is set to -1L.  That is the modification to cut.POSIXt() that I made.

--please do not edit the information below--

Version:
 platform = i386-pc-mingw32
 arch = i386
 os = mingw32
 system = i386, mingw32
 status = 
 major = 2
 minor = 10.1
 year = 2009
 month = 12
 day = 14
 svn rev = 50720
 language = R
 version.string = R version 2.10.1 (2009-12-14)

Windows XP (build 2600) Service Pack 3

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

Search Path:
 .GlobalEnv, package:stats, package:graphics, package:grDevices, package:utils, package:datasets, package:methods, Autoloads, package:base

On 2/8/2010 11:30 AM, diggsb@ohsu.edu wrote:
> U3VtbWFyeToNCg0KRm9yIGNlcnRhaW4gd2VsbCBmb3JtZWQgaW5wdXRzLCBjdXQuUE9TSVh0IHdp
> bGwgZ2l2ZSBhbiBlcnJvci4NCg0KRXhhbXBsZToNCg0KY3V0KGFzLlBPU0lYY3QoIjIwMDktMTEt
> MDEgMDQ6MDA6MDAiLCB0ej0iQW1lcmljYS9Mb3NfQW5nZWxlcyIpLCAiMSBkYXkiKQ0KDQpFeGFt
> cGxlIG91dHB1dDoNCg0KRXJyb3IgaW4gc2VxLmludCgwLCB0byAtIGZyb20sIGJ5KSA6ICd0bycg
> bXVzdCBiZSBmaW5pdGUNCg0KUGF0Y2ggdG8gZml4IGVycm9yOg0KDQpUaGlzIHBhdGNoIGlzIGZv
> ciBzcmMvbGlicmFyeS9iYXNlL1IvZGF0ZXRpbWUuUg0KDQpJbmRleDogZGF0ZXRpbWUuUg0KPT09
> PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
> PT09PT09PQ0KLS0tIGRhdGV0aW1lLlIJKHJldmlzaW9uIDUxMTEwKQ0KKysrIGRhdGV0aW1lLlIJ
> KHdvcmtpbmcgY29weSkNCkBAIC03MjksNyArNzI5LDcgQEANCiAJaW5jciA8LSAxDQogCWlmKHZh
> bGlkID4gMUwpIHsgc3RhcnQkc2VjIDwtIDBMOyBpbmNyIDwtIDU5Ljk5IH0NCiAJaWYodmFsaWQg
> PiAyTCkgeyBzdGFydCRtaW4gPC0gMEw7IGluY3IgPC0gMzYwMCAtIDEgfQ0KLQlpZih2YWxpZCA+
> IDNMKSB7IHN0YXJ0JGhvdXIgPC0gMEw7IGluY3IgPC0gODY0MDAgLSAxIH0NCisJaWYodmFsaWQg
> PiAzTCkgeyBzdGFydCRob3VyIDwtIDBMOyBzdGFydCRpc2RzdCA8LSAtMUw7IGluY3IgPC0gODY0
> MDAgLSAxIH0NCiAJaWYodmFsaWQgPT0gNUwpIHsgIyB3ZWVrcw0KIAkgICAgc3RhcnQkbWRheSA8
> LSBzdGFydCRtZGF5IC0gc3RhcnQkd2RheQ0KIAkgICAgaWYoc3RhcnQub24ubW9uZGF5KQ0KDQpE
> aXNjdXNzaW9uL2Rlc2NyaXB0aW9uOg0KDQpUaGUgYnVnIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSAo
> ZWFybGllc3QpIGRhdGUvdGltZSBnaXZlbiB0byBjdXQuUE9TSVh0IA0KZmFsbHMgb24gdGhlIGRh
> eSB0cmFuc2l0aW9uaW5nIGZyb20gZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHRvIHN0YW5kYXJkIA0K
> dGltZSwgYnV0IGF0IGEgdGltZSBhZnRlciB0aGUgc3dpdGNob3Zlci4gIEluIHRoZSBVUywgTm92
> ZW1iZXIgMSwgMjAwOSB3YXMNCnN1Y2ggYSBkYXkuDQoNCkluIGN1dC5QT1NJWHQoKSwgdGhlIGVs
> ZW1lbnRzIG9mIGEgUE9TSVhsdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhcnRpbmcgDQpkYXRl
> L3RpbWUgYXJlIGRpcmVjdGx5IG1hbmlwdWxhdGVkIHRvIHNldCBpdCB0byB0aGUgc3RhcnQgb2Yg
> dGhlIGRheSANCihzaW5jZSBhIGRheSBzaXplZCBzcGFjaW5nIHdhcyByZXF1ZXN0ZWQpLiAgVGhp
> cyBwdXRzIGl0IGJlZm9yZSB0aGUgZGF5bGlnaHQgDQpzYXZpbmdzIHRpbWUgdG8gc3RhbmRhcmQg
> dGltZSBzd2l0Y2hvdmVyLiAgV2hlbiBhcy5QT1NJWGN0IGlzIGxhdGVyIGNhbGxlZCANCm9uIHRo
> aXMgb2JqZWN0LCBpdCByZXR1cm5zIE5BIHdoaWNoIGNhdXNlcyB0aGUgcmV0dXJuZWQgZXJyb3Ig
> d2hlbiB0aGUgTkEgDQppcyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gc2VxLmludCgpLg0KDQpU
> aGUgbW90aXZhdGlvbiBmb3IgdGhlIHBhdGNoIGlzIHRoZSB0cnVuYy5QT1NJWHQgZnVuY3Rpb24g
> aW4gdGhlIHNhbWUgDQpmaWxlLiAgSXQgY29ycmVjdGx5IGhhbmRsZXMgdGhpcyBjYXNlOg0KDQp0
> cnVuYyhhcy5QT1NJWGN0KCIyMDA5LTExLTAxIDA0OjAwOjAwIiwgdHo9IkFtZXJpY2EvTG9zX0Fu
> Z2VsZXMiKSwgImRheSIpDQojIFsxXSAiMjAwOS0xMS0wMSBBbWVyaWNhL0xvc19BbmdlbGVzIg0K
> YXMuUE9TSVhjdCh0cnVuYyhhcy5QT1NJWGN0KCIyMDA5LTExLTAxIDA0OjAwOjAwIiwgdHo9IkFt
> ZXJpY2EvTG9zX0FuZ2VsZXMiKSwgImRheSIpKQ0KIyBbMV0gIjIwMDktMTEtMDEgUERUIg0KDQpJ
> biB0aGF0IGZ1bmN0aW9uLCB3aGVuIHRydW5jYXRpbmcgdG8gZGF5cywgdGhlIGlzZHN0IGVsZW1l
> bnQgb2YgdGhlIFBPU0lYbHQNCmlzIHNldCB0byAtMUwuICBUaGF0IGlzIHRoZSBtb2RpZmljYXRp
> b24gdG8gY3V0LlBPU0lYdCgpIHRoYXQgSSBtYWRlLg0KDQotLQ0KQnJpYW4gRGlnZ3MsIFBoLkQu
> DQpTZW5pb3IgUmVzZWFyY2ggQXNzb2NpYXRlLCBEZXBhcnRtZW50IG9mIFN1cmdlcnksIE9yZWdv
> biBIZWFsdGggJiBTY2llbmNlIFVuaXZlcnNpdHkNCg0KLS1wbGVhc2UgZG8gbm90IGVkaXQgdGhl
> IGluZm9ybWF0aW9uIGJlbG93LS0NCg0KVmVyc2lvbjoNCiBwbGF0Zm9ybSA9IGkzODYtcGMtbWlu
> Z3czMg0KIGFyY2ggPSBpMzg2DQogb3MgPSBtaW5ndzMyDQogc3lzdGVtID0gaTM4NiwgbWluZ3cz
> Mg0KIHN0YXR1cyA9IA0KIG1ham9yID0gMg0KIG1pbm9yID0gMTAuMQ0KIHllYXIgPSAyMDA5DQog
> bW9udGggPSAxMg0KIGRheSA9IDE0DQogc3ZuIHJldiA9IDUwNzIwDQogbGFuZ3VhZ2UgPSBSDQog
> dmVyc2lvbi5zdHJpbmcgPSBSIHZlcnNpb24gMi4xMC4xICgyMDA5LTEyLTE0KQ0KDQpXaW5kb3dz
> IFhQIChidWlsZCAyNjAwKSBTZXJ2aWNlIFBhY2sgMw0KDQpMb2NhbGU6DQpMQ19DT0xMQVRFPUVu
> Z2xpc2hfVW5pdGVkIFN0YXRlcy4xMjUyO0xDX0NUWVBFPUVuZ2xpc2hfVW5pdGVkIFN0YXRlcy4x
> MjUyO0xDX01PTkVUQVJZPUVuZ2xpc2hfVW5pdGVkIFN0YXRlcy4xMjUyO0xDX05VTUVSSUM9QztM
> Q19USU1FPUVuZ2xpc2hfVW5pdGVkIFN0YXRlcy4xMjUyDQoNClNlYXJjaCBQYXRoOg0KIC5HbG9i
> YWxFbnYsIHBhY2thZ2U6c3RhdHMsIHBhY2thZ2U6Z3JhcGhpY3MsIHBhY2thZ2U6Z3JEZXZpY2Vz
> LCBwYWNrYWdlOnV0aWxzLCBwYWNrYWdlOmRhdGFzZXRzLCBwYWNrYWdlOm1ldGhvZHMsIEF1dG9s
> b2FkcywgcGFja2FnZTpiYXNlDQoNCg0KDQo=
> 


Comment 2 Jitterbug compatibility account 2010-02-09 03:20:33 UTC
From: Peter Dalgaard <p.dalgaard@biostat.ku.dk>


> I do not know why my bug report got so oddly encoded, I've reproduced
> it; hopefully it won't get mangled again.

It did, unfortunately. Not your fault, it's just that Jitterbug is 
incapable of undoing Content-Transfer-Encoding on incoming mail, so if 
your mail transfer agent sends in base64, it goes straight through to 
R-devel.

Never mind, the old bug repository will have to die rather soon now, 
hopefully to be replaced by something much better.

Un-base64'ed version follows below, possibly modulo linebreaks.

- Peter D.

------
Summary:

For certain well formed inputs, cut.POSIXt will give an error.

Example:

cut(as.POSIXct("2009-11-01 04:00:00", tz="America/Los_Angeles"), "1 day")

Example output:

Error in seq.int(0, to - from, by) : 'to' must be finite

Patch to fix error:

This patch is for src/library/base/R/datetime.R

Index: datetime.R
===================================================================
--- datetime.R	(revision 51110)
+++ datetime.R	(working copy)
@@ -729,7 +729,7 @@
  	incr <- 1
  	if(valid > 1L) { start$sec <- 0L; incr <- 59.99 }
  	if(valid > 2L) { start$min <- 0L; incr <- 3600 - 1 }
-	if(valid > 3L) { start$hour <- 0L; incr <- 86400 - 1 }
+	if(valid > 3L) { start$hour <- 0L; start$isdst <- -1L; incr <- 86400 - 1 }
  	if(valid == 5L) { # weeks
  	    start$mday <- start$mday - start$wday
  	    if(start.on.monday)

Discussion:

The bug is triggered when the (earliest) date/time given to cut.POSIXt
falls on the day transitioning from daylight savings time to standard
time, but at a time after the switchover.  In the US, November 1, 2009 was
such a day.

In cut.POSIXt(), the elements of a POSIXlt representation of the date/time
are directly manipulated to set it to the start of the day (since a day
sized spacing was requested).  This puts it before the daylight savings
time to standard time switchover.  When as.POSIXct is later called on this
object, it returns NA which causes the returned error when the NA is passed
as an argument to seq.int().

The motivation for the patch is the trunc.POSIXt function in the same
file.  It correctly handles this case:

trunc(as.POSIXct("2009-11-01 04:00:00", tz="America/Los_Angeles"), "day")
# [1] "2009-11-01 America/Los_Angeles"
as.POSIXct(trunc(as.POSIXct("2009-11-01 04:00:00", 
tz="America/Los_Angeles"), "day"))
# [1] "2009-11-01 PDT"

In that function, when truncating to days, the isdst element of the POSIXlt
is set to -1L.  That is the modification to cut.POSIXt() that I made.

--please do not edit the information below--

Version:
  platform = i386-pc-mingw32
  arch = i386
  os = mingw32
  system = i386, mingw32
  status =
  major = 2
  minor = 10.1
  year = 2009
  month = 12
  day = 14
  svn rev = 50720
  language = R
  version.string = R version 2.10.1 (2009-12-14)

Windows XP (build 2600) Service Pack 3

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

Search Path:
  .GlobalEnv, package:stats, package:graphics, package:grDevices, 
package:utils, package:datasets, package:methods, Autoloads, package:base

-- 
    O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
   c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
  (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)              FAX: (+45) 35327907

Comment 3 Jitterbug compatibility account 2010-02-14 21:54:00 UTC
NOTES:
 Note that the example depends on the locale.
Code changed in 2.11.0.
Comment 4 Jitterbug compatibility account 2010-02-14 21:54:47 UTC
Audit (from Jitterbug):
Sun Feb 14 15:54:47 2010	ripley	changed notes
Sun Feb 14 15:54:47 2010	ripley	moved from incoming to Misc-fixed