r - R posixct 日期和时间不以午夜为中心
问题描述
我将日期和时间存储在两列中。第一个的日期为“20180831”。时间存储为从午夜开始的秒数;凌晨 3 点将存储为 10,800。
我需要一个组合的日期时间列,并且很难处理应该简单的事情。
我可以毫无问题地获得日期,但 lubridate “hms” 将时间字段解释为一个时期,而不是“时间”本身。
我尝试将日期转换为 posix.ct 格式,然后将其用作时间字段的原点,但 posix.ct 并未将时间设置为午夜,而是根据日期将其设置为 1800 或 1900 小时。我需要将所有行设置为午夜,我不想要任何夏令时调整。
下面是代码:首先我创建了一个函数,因为我必须为多个日期和时间字段执行此操作。
mkdate<-function(x){
a<-as.Date(as.character(x),format='%Y%m%d')
a<-as.POSIXct(a)
return(a)
}
df$date<-mkdate(df$date) #applies date making function to date field
df$datetime<-as.POSIXct(df$time,origin=df$date)
我确定这与时区有关。我在中央时区,我已经尝试在 mkdate 函数和创建“datetime”列的时间代码中将“tz”规范添加到这些命令中。我试过了:
tz="America/Chicago"
tz="CST"
tz="UTC"
帮助将不胜感激!
用示例编辑:
x<-c(20180831,20180710,20160511,20170105,20180101) #these are dates.
as.POSIXct(as.Date(as.character(x),format="%Y%m%d"))
上面的代码将日期转换为 1970 年 1 月 1 日的秒数。我可以将其转换为数字并将我的“秒”值添加到该字段,但它不正确。这就是我看到的输出:
[1] "2018-08-30 19:00:00 CDT" "2018-07-09 19:00:00 CDT" "2016-05-10 19:00:00 CDT" "2017-01-04 18:00:00 CST" "2017-12-31 18:00:00 CST"
查看第一个日期 - 它应该是 8/31,但实际上是 8/30。那里的某个地方正在进行时区调整。因为我在中央时间,它把时钟拨回了 5 或 6 个小时。第一个条目应该是 2018-08-31 00:00:00。然后我会将其转换为数字并添加秒字段并转换回 POSIXct 格式。我试过在所有地方都包含 tz 规范,但没有运气。
Sys.getlocale("LC_TIME")
返回“English_United States.1252”
解决方案
有很多方法可以做到这一点:
mktime = function(a, b)modifyList(strptime(a, '%Y%m%d'), list(sec = as.numeric(gsub(',', '', b))))
mktime("20180831",'10,800')
[1] "2018-08-31 03:00:00 PDT"
mktime('20180301','10800')
[1] "2018-03-01 03:00:00 PST"
mktime('20180321','10800')
[1] "2018-03-21 03:00:00 PDT"
查看上面的代码,它没有针对夏令时进行调整。无论日期如何,秒数仍然显示现在是凌晨 3 点,包括 ST-->DT 的日期。这也将考虑到您的本地时区。