R posixct日期和时间不以午夜为中心
R posixct dates and times not centering on midnight
我将日期和时间存储在两列中。第一个日期为“20180831”。时间存储为从午夜算起的秒数;凌晨 3 点将存储为 10,800。
我需要一个合并的日期时间列,但我很难处理本应简单的内容。
我可以毫无问题地获取日期,但 lubridate "hms" 将时间字段解释为一个句点,而不是 'time' 本身。
我尝试将日期转换为 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")
returns "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 时的日期。这也将考虑到您当地的时区。
我相信以下是您想要的。
我的语言环境如下,所以结果和你的不一样。
Sys.getlocale("LC_TIME")
#[1] "Portuguese_Portugal.1252"
不同之处在于夏令时,夏令时。
至于你的问题,你所要做的就是记住 class "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"
我将日期和时间存储在两列中。第一个日期为“20180831”。时间存储为从午夜算起的秒数;凌晨 3 点将存储为 10,800。
我需要一个合并的日期时间列,但我很难处理本应简单的内容。
我可以毫无问题地获取日期,但 lubridate "hms" 将时间字段解释为一个句点,而不是 'time' 本身。
我尝试将日期转换为 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")
returns "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 时的日期。这也将考虑到您当地的时区。
我相信以下是您想要的。
我的语言环境如下,所以结果和你的不一样。
Sys.getlocale("LC_TIME")
#[1] "Portuguese_Portugal.1252"
不同之处在于夏令时,夏令时。
至于你的问题,你所要做的就是记住 class "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"