我将日期和时间存储在两列中。第一个的日期为“ 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”
答案 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"