问题描述:
在本地使用as.Date()函数从POSIXct类型中提取date时,出现了日期不一致的错误。导致处理数据时,总是出问题。
还好被领导发现数据有误,不然这个bug不知道还要潜伏多久。尽管如此,找出这个问题还是花了我很长时间。
原因:
这里的问题在于,当我们用as.POSIXct将形如 "2016-04-15 00:00:37" 的字符转换为POSIXct类型时,默认使用的是本地系统的时区。
如中国的时区是CST,则得到的POSIXct为:"2016-04-15 00:00:37 CST".
但是使用as.Date(POSIXct)提取date时,as.Date()函数默认使用的标准时间是UTC。所以这里就出现了8小时的误差,导致提取出来的日期不一致。
as.Date()函数文档的相关说明: The as.Date methods accept character strings, factors, logical NA and objects of classes "POSIXlt" and "POSIXct". (The last is converted to days by ignoring the time after midnight in the representation of the time in specified time zone, default UTC.)
(括号里大意是说,用as.Date函数转换POSIXct格式的数据时,默认将POSIXct转为UTC时区后,再取days) as.POSIXct()函数文档的相关说明: System-specific (see time zones), but "" is the current time zone, and "GMT" is UTC (Universal Time, Coordinated). (大意是说,as.POSIXct()时若没有指定tz字段,则函数会使用操作系统所在的时区,""表示当前时区。)
解决方法:
比较合理的方法应该是:根据需要使用tz字段直接指定所用的时区。保证两者时区统一。
不过只是想提取date的话,使用as.Date(format(POSIXct_string, '%Y%m%d'))应该也是可以的
关于时区的概念可参考百度百科:http://baike.baidu.com/view/42936.htm