R posixct日期和时间不以午夜为中心

时间:2018-09-12 14:06:15

标签: r date time lubridate

我将日期和时间存储在两列中。第一个的日期为“ 20180831”。时间存储为从午夜起的秒数。凌晨3点将存储为10,800。

我需要一个组合的日期时间列,并且在一些简单的事情上遇到了麻烦。

我可以毫无问题地得到日期,但是润滑“ 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日开始转换为秒。我可以将其转换为数字,然后将“ seconds”值添加到该字段中,但不正确。这是我看到的输出:

[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”

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我相信以下内容可以满足您的需求。
我的语言环境如下,因此结果与您的不同。

Sys.getlocale("LC_TIME")
#[1] "Portuguese_Portugal.1252"

差异将归因于夏时制,夏季时间。

对于您的问题,您要做的只是记住将类"POSIXct的对象编码为自起点以来的秒数,并且起点通常是1970-01-01的午夜。因此,您必须将午夜以来的秒数添加到as.Date的秒数中。

x <- "20180831"

xd <- mkdate(x)
y <- 10800

as.POSIXct(as.integer(xd) + y, origin = "1970-01-01")
#[1] "2018-08-31 04:00:00 BST"

as.POSIXct(as.integer(xd) + y, origin = "1970-01-01", tz = "America/Chicago")
#[1] "2018-08-30 22:00:00 CDT"