2016-05-06 2 views
-1

У меня есть дата-рамка, в которой в одном столбце перечисляется множество дат. Как ни странно, тип данных для этого столбца является «целым числом». Мне нужно принудить столбец к правильному типу данных datetime, например POSIXct, чтобы я мог вычесть эти временные метки из тех, которые находятся в другом поле. Однако, когда я пытаюсь принудить эти значения datetime к POSIXct, они теряют компонент времени. Когда я пытаюсь выполнить математику по датам без предварительного принуждения к другому типу данных, R действует так, как будто временной компонент временной метки не существует (предполагается, что каждая дата имеет время полуночи). Что происходит и как я могу это исправить, чтобы R распознал метку времени?R не распознает компонент времени значений даты и времени

> dates[1] 
[1] 2016-05-05T16:46:21-04:00 
48 Levels: 2016-05-03T06:45:42-04:00 2016-05-03T06:45:43-04:00 ... 2016-05-05T16:50:00-04:00 
> typeof(dates) 
[1] "integer" 
> as.POSIXct(dates[1]) 
[1] "2016-05-05 EDT" 
> as.character(dates[1]) 
[1] "2016-05-05T16:46:21-04:00" 
> as.POSIXct(as.character(dates[1])) 
[1] "2016-05-05 EDT" 
+0

«48 уровней» - это намек на то, что R рассматривает его как факторы. Если вы использовали 'read.csv', то используйте' stringAsFactors = F' – rbm

+0

У вас есть нестандартный формат даты и времени. R, вероятно, понадобится помощь 'as.POSIXct (" 2016-05-05T16: 46: 21-04: 00 ", format ="% Y-% m-% dT% H:% M:% S ")' –

ответ

2

Вы можете использовать as.POSIXct с tz аргументом для преобразования метки времени с правильным уровнем контроля.

Если часовые пояса все UTC-04: 00, и что ваша локальная временная зона, вы можете использовать:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz=Sys.timezone()) 

Если все они UTC-04: 00, а не локальный часовой пояс, но вы знаете точное местоположение, то вы можете указать соответствующий часовой пояс из tz database:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz="America/Port_of_Spain") 

в качестве альтернативы, вы можете использовать общий GMT-4 часовой пояс:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz="Etc/GMT-4") 

[EDIT: спасибо Роланду за его комментарий ниже. Первоначально я использовал strptime, который использует тот же синтаксис, но возвращает объект POSIXlt.]

+1

Вы можете использовать 'as.POSIXct' таким же образом. Он дает вам объект POSIXct, который обычно предпочтительнее POSIXlt, и это то, что возвращает 'strptime'. – Roland

+0

Спасибо, я внесла поправки в свой ответ. – ajrwhite

+0

Это сработало отлично. Благодаря! – user3786999

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