我在 R 名称中有一个数据框作为数据。
data <- as.xts(read.zoo("data1.csv",sep=",",tz="" ,header=T))
格式的数据索引2004-01-04 09:44:00 IST
我应用了将索引更改为日期的操作
index(data) <- as.Date(index(data))
输出应该是2004-01-04
系统产生2004-01-03
的。
这在 Windows 中可以正常工作,但在 Linux 上不起作用。
我在 R 名称中有一个数据框作为数据。
data <- as.xts(read.zoo("data1.csv",sep=",",tz="" ,header=T))
格式的数据索引2004-01-04 09:44:00 IST
我应用了将索引更改为日期的操作
index(data) <- as.Date(index(data))
输出应该是2004-01-04
系统产生2004-01-03
的。
这在 Windows 中可以正常工作,但在 Linux 上不起作用。
Arun 是正确的,问题出在语言环境上。您的数据具有印度标准时间戳,并且您具有美国语言环境,至少晚 10.5 小时。因此,时间09:44
实际上是您所在时区的前一天晚上很晚。
日期和时间非常复杂,R 使用底层操作系统功能进行计算,这就是为什么你在不同的机器上看到不同的结果。Linux 符合 POSIX 并理解像“IST”这样的时区,这允许它对前一天晚上进行更改。Windows 没有,这就是为什么它将日期指定为01-04
. 要在 Windows 上获取正确的时区更新,您需要指定时区的全名“亚洲/加尔各答”。维基百科有一个时区名称列表。
编辑:实际上,R 附带一个文件,其中包含它接受的所有“大陆/城市”(奥尔森风格)名称。它存储在
file.path(R.home("share"), "zoneinfo", "zone.tab")
帮助页面上的示例?Sys.timezone
告诉您如何以编程方式阅读它。
我发现这个lubridate
包让事情变得更容易看到正在发生的事情。
library(lubridate)
x <- ymd_hms("2004-01-04 09:44:00 IST", tz = "Asia/Kolkata")
x
# [1] "2004-01-04 09:44:00 IST"
with_tz(x, "America/New_York")
# [1] "2004-01-03 23:14:00 EST"
Date <- c("2010-01-04 09:04:00", "2010-01-04 09:05:00")
Open <- c(5222.9, 5220.2)
Low <- c(5224.6, 5222.95)
High <- c(5220.1, 5218.6)
Close <- c(5220.35, 5222.95)
x <- data.frame(Date = Date, Open = Open, Low = Low, High = High, Close = Close)
as.Date(x$Date)
输出:
[1] "2010-01-04" "2010-01-04"
在我看来没问题。
Edit:
require(zoo)
data <- as.xts(read.zoo("data1.csv",sep=",",tz="" ,header=T))
> dput(data)
structure(c(5222.9, 5220.2, 5224.6, 5222.95, 5220.1, 5218.6,
5220.35, 5222.95), .Dim = c(2L, 4L), .Dimnames = list(NULL, c("Open",
"Low", "High", "Close")), index = structure(c(1262592240, 1262592300
), tzone = "", tclass = c("POSIXct", "POSIXt")), class = c("xts",
"zoo"), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct",
"POSIXt"), .indexTZ = "", tzone = "")
> as.Date(index(data))
[1] "2010-01-04" "2010-01-04"
在我的 Mac 上它工作正常。我怀疑您的系统语言环境设置错误。此外,您可能想在 R 中检查它。
这个命令Sys.getlocale()
给你什么 inWindows
和 in Linux
inside R
?