首页 > 解决方案 > 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”

标签: rdatetimelubridate

解决方案


有很多方法可以做到这一点:

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 的日期。这也将考虑到您的本地时区。


推荐阅读