2017-02-04 4 views
0

Я работаю с большим набором данных (наблюдение 100k) раз, используя функцию as.POSIXct.POSIXct и различные часовые пояса

Времена, однако, имеют два различных часовых поясов:

"Thu Jan 17 09:29:10 EST 2013" 
"Sun Mar 10 21:31:28 EDT 2013" 

Я пытаюсь поставить их в тот же часовой пояс и формат, так что я могу найти время расстояние между ними. Я делаю это следующим образом:

as.POSIXct("Thu Jan 17 09:29:10 EST 2013", format="%a %b %d %H:%M:%S EST %Y") 

as.POSIXct("Sun Mar 10 21:31:28 EDT 2013", format="%a %b %d %H:%M:%S EDT %Y") 

Я хочу сделать это конверсия оптом. Для этого я создал следующие функции, если:

mydata$converteddate = numeric(length(mydata$dates)) 

for (i in seq_along(mydata$converteddate)) { 
    if (grepl("EST",mydata$dates[i])) mydata$converteddate[i]=as.POSIXct(mydata$dates, format="%a %b %d %H:%M:%S EST %Y") 
    if (grepl("EDT",mydata$dates[i])) mydata$converteddate[i]=as.POSIXct(mydata$dates, format="%a %b %d %H:%M:%S EDT %Y")-(60*60)} 

Это побежал в течение последних нескольких часов, что, кажется, что это не должно быть так. Есть ли более быстрые проблемы? Обратите внимание, что часть 60 * 60 преобразует EDT в EST.

EDIT: уточнить, мой главный вопрос - это не вопрос часового пояса, но как эффективно перебирать набор данных для преобразования всех дат в удобный формат. Я ушел со своего компьютера в течение 5 часов, и он все еще работал на 100 тыс. Случаев.

+1

Это тот же часовой пояс; «EDT» просто обозначает, что дневная экономия действует. Например, 'as.POSIXct (« 2013-03-09 01:01:00 », tz =« America/New_York ») + (24 * 3600) * (0: 2)'. – nrussell

+0

Или еще лучше, 'as.POSIXct (" 2013-03-10 01:59:59 ", tz =" America/New_York ") + 0: 2'. – nrussell

+0

Мой вопрос не обязательно в часовом поясе, но как цикл для преобразования всех из них. Другая проблема заключается в том, что я работаю с циклами для этого процесса, который я вычисляю, принимая разницу между двумя датами. Если кто-то находится в EDT, а другой находится в EST, необходимо преобразование, правильно? Есть ли лучший способ выполнить все данные для преобразования? – macworthy

ответ

0

Если x вектор входной символ, удалить часовой пояс с помощью первой sub и указать его с помощью tz:

as.POSIXct(sub("E.T ", "", x), format = "%a %b %d %H:%M:%S %Y", tz = "EST5EDT") 
0

Вы можете решить эту проблему с anytime() функцией anytime пакета.

Формат, который вы встречаете не , но поддерживается по умолчанию (хотя я добавлю это).

Это, однако, на самом деле легко добавить к текущей версии 0.2.0, а также:

R> library(anytime) 
R> anytime::addFormats("%a %b %d %H:%M:%S% xxx %Y") # adding it 
R> anytime("Thu Jan 17 09:29:10 EST 2013") 
[1] "2013-01-17 09:29:10 CST" 
R> 

Ключевым моментом здесь является то, что мы добавим нужный формат с флагом «ххх», чтобы скрыть часовой пояс Информация. Как уже говорилось выше, EST и EDT просто иллюстративны. Здесь мы получаем КНТ как я в Центральном часовом поясе.

Производительность также должна помочь вам как anytime пакета использует производительный C++ кода под капотом:

R> bigvec <- rep("Thu Jan 17 09:29:10 EST 2013", 100000L) 
R> system.time(res <- anytime(bigvec)) 
    user system elapsed 
    0.600 0.164 0.767 
R> 

Это примерно 3/4 секунды для 100000 переходов на моем старом, более низком тактовом сервере.

Смежные вопросы