Даты в R различаются между 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.


person user1177819    schedule 04.01.2013    source источник
comment
Дата Открыть Низкий Высокий Закрыть 04.01.2010 09:04:00 5222.9 5224.6 5220.1 5220.35 04.01.2010 09:05:00 5220.2 5222.95 5218.6 5222.95 index(data) ‹- as.Date(index(data)) . Если я наберу индекс (дата) [1] в командной строке, он выдаст 2010-01-03, а не 2010-01-04.   -  person user1177819    schedule 04.01.2013
comment
Файлы data.csv содержат данные в формате Date,Open,Low,High,Close данные (data1.csv,sep=,,tz= ,header=T)) index(data) ‹- as.Date(index(data)) . Указатель данных, которые он дает по состоянию на 03 января 2010 г.   -  person user1177819    schedule 04.01.2013


Ответы (2)


Арун прав, проблема в локали. В ваших данных указана отметка стандартного индийского времени, а у вас местный стандарт США, который отстает как минимум на 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"
person Richie Cotton    schedule 04.01.2013
comment
если я запускаю команду as.Date(data), она дает правильную дату даже в Linux. класс (индекс (данные)) - POSIXct. Когда я меняю POSIXct на объект даты, используя index(data) ‹- as.Date(index(data)) тогда он сохраняет дату предыдущего дня в index(data) - person user1177819; 08.01.2013

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() в Windows и в Linux в R?

person Arun    schedule 04.01.2013
comment
Сначала измените этот фрейм данных на временной ряд, используя приведенную ниже команду data ‹- as.xts(read.zoo(data1.csv,sep=,,tz=,header=T)) здесь index(data) производит 2010-01-04 2010-01-04, затем сделайте index(data) ‹- as.Date(index(data)) здесь выводит как 2010-01-03 2010-01-03. Эта проблема возникает только в линуксе. Тот же код работает в окне. - person user1177819; 04.01.2013
comment
Что вы подразумеваете под локалью и как это проверить. Я проверил date() в Linux и окне, и он дает текущее время и дату. - person user1177819; 04.01.2013
comment
Все проверил, ВСЕ локальные настройки верны. Есть какая-то другая проблема - person user1177819; 04.01.2013
comment
Sys.getlocale() в окне дает: LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252 в Linux дает: LC_CTYPE=en_US.UTF- 8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C; LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C - person user1177819; 04.01.2013
comment
Проблема еще не решена. Любая другая идея - person user1177819; 04.01.2013