2016-12-01 2 views
-1

У меня есть несколько переменных, которые существуют в следующем формате:Преобразовать Дата с использованием специального формата R

/Date(1353020400000+0100)/

Я хочу, чтобы преобразовать этот формат DDMMYYYY. Я нашел this solution for the same problem using php, но я ничего не знаю о php, поэтому я не могу преобразовать это решение в то, что мне нужно, это решение, которое я могу использовать в R.

Любые предложения?

Спасибо.

+1

Вы хотите поделиться, какой формат даты? '+ 0100', кажется, намекает на смещение UTC, в то время как длинное число выглядит как миллисекунды с эпохи или что-то в этом роде. – AlexR

+2

Это мой голос за "Самое худшее название когда-либо" – WillardSolutions

+0

Вы запросили два разных формата вывода. Почему бы не вместо этого изменить вопрос, чтобы вы могли принять один из приведенных ниже ответов и сделать свое собственное чтение на '. Format.POSIXct' –

ответ

2

Пакет lubridate может прийти на помощь следующим образом:

as.Date("1970-01-01") + lubridate::milliseconds(1353020400000) 

чтения: Количество миллисекунд с начала эпохи (= 1 января 1970, UTC + 0)

Функция синтаксического анализа теперь может быть сделанные с использованием регулярных выражений:

parse.myDate <- function(text) { 
    num <- as.numeric(stringr::str_extract(text, "(?<=/Date\\()\\d+")) 
    as.Date("1970-01-01") + lubridate::milliseconds(num) 
} 

наконец, формат даты с format(theDate, "%d/%m/%Y %H:%M")

Если нужна информация о часовом поясе, вы можете использовать вместо этого:

parse.myDate <- function(text) { 
    parts <- stringr::str_match(text, "^/Date\\((\\d+)([+-])(\\d{4})\\)/$") 
    as.POSIXct(as.numeric(parts[,2])/1000, origin = "1970-01-01", tz = paste0("Etc/GMT", parts[,3], as.integer(parts[,4])/100)) 
} 
+0

Спасибо за помощь, это именно то, что мне нужно, до – Tkelly

3

Если формат миллисекунд с начала эпохи, то anytime() или as.POSIXct() может помочь вам:

R> anytime(1353020400000/1000) 
[1] "2012-11-15 17:00:00 CST" 
R> anytime(1353020400.000) 
[1] "2012-11-15 17:00:00 CST" 
R> 

anytime() преобразует в местное время, что для меня является Чикаго. Вам придется иметь дело со смещением UTC отдельно.

Base R может это делать, но вам нужно страшился происхождение:

R> as.POSIXct(1353020400.000, origin="1970-01-01") 
[1] "2012-11-15 17:00:00 CST" 
R> 
+0

Какой пакет '' в любое время'? BTW: Я не знал, что вы можете передать персонажа непосредственно в «происхождение». Всегда используется 'as.Date (" 1970-01-01 ")' ... – AlexR

+0

@AlexR - это так сложно - из файлов справки 'origin - объект Date или что-то, что может быть вызвано as.Date (происхождение, ...) к такому объекту.' – thelatemail

+0

@thelatemail К счастью, у нас обычно есть вещи, которые можно проанализировать красиво компактными' lubridate :: ymd() 'и друзьями. Но приятно знать, потому что другой код быстро становится уродливым. – AlexR

3

Насколько я могу сказать от связанного вопроса, это миллисекунды начиная с эпохи:

x <- "/Date(1353020400000+0100)/" 
spl <- strsplit(x, "[()+]") 
as.POSIXct(as.numeric(sapply(spl,`[[`,2))/1000, origin="1970-01-01", tz="UTC") 
#[1] "2012-11-15 23:00:00 UTC" 

Если вы хотите подобрать разницу в часовом поясе, вот попытка:

x <- "/Date(1353020400000+0100)/" 
spl <- strsplit(x, "(?=[+-])|[()]", perl=TRUE) 

tzo <- sapply(spl, function(x) paste(x[3:4],collapse="")) 
dt <- as.POSIXct(as.numeric(sapply(spl,`[[`,2))/1000, origin="1970-01-01", tz="UTC") 

as.POSIXct(paste(format(dt), tzo), tz="UTC", format = '%F %T %z') 
#[1] "2012-11-15 22:00:00 UTC" 
+0

Кто-нибудь хочет объяснить нижний план? Ответ, похоже, работает на меня. – thelatemail

+0

Самое интересное ... (-1) ушло на мой ответ. Для меня все ответы имеют свои преимущества. Ваш, кажется, единственный векторизованный в настоящее время (+1) ... – AlexR

+0

@AlexR - все они должны быть векторизованы, я верю, включая ваши. – thelatemail

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