Проблемы с созданием нового столбца в таблице данных с использованием strptime

У меня есть некоторые данные, которые являются классом символов:

class(solarX[,MEASDATE])
[1] "character"

Что выглядит так:

    head(solarX[,MEASDATE])
[1] "1/05/2015 0:00" "1/05/2015 0:30" "1/05/2015 1:00" "1/05/2015 1:30" "1/05/2015 2:00" "1/05/2015 2:30"

Однако я не хочу, чтобы это было в символьном формате, и мне нужно иметь доступ к часам и минутам даты и времени.

Что я пробовал:

strptime(solarX[,MEASDATE], "%d/%m/%Y %H:%M"))

Что отлично работает, это дает мне:

 [1] "2015-05-01 00:00:00 AEST" "2015-05-01 00:30:00 AEST" "2015-05-01 01:00:00 AEST" "2015-05-01 01:30:00 AEST" "2015-05-01 02:00:00 AEST"
[6] "2015-05-01 02:30:00 AEST"



 class(strptime(solarX[,MEASDATE], "%d/%m/%Y %H:%M"))
[1] "POSIXlt" "POSIXt"

Однако, когда я иду, чтобы увеличить свою исходную таблицу данных, выполнив:

solarX[, date := strptime(solarX[,MEASDATE], "%d/%m/%Y %H:%M")]

(solarX — моя таблица данных)

Я получаю следующее предупреждение:

    Warning message:
In `[.data.table`(solarX, , `:=`(date, strptime(solarX[, MEASDATE],  :
  Supplied 11 items to be assigned to 17568 items of column 'date' (recycled leaving remainder of 1 items)

И возвращенная таблица данных выглядит ужасно:

    MEASDATE      rrp exp_kwh                     date
1: 1/05/2015 0:00 33.99299       0             0,0,0,0,0,0,
2: 1/05/2015 0:30 31.53335       0        0,30, 0,30, 0,30,
3: 1/05/2015 1:00 29.37092       0             0,0,1,1,2,2,
4: 1/05/2015 1:30 28.03197       0             1,1,1,1,1,1,
5: 1/05/2015 2:00 26.82800       0             4,4,4,4,4,4,
6: 1/05/2015 2:30 25.22149       0 115,115,115,115,115,115,

Очевидно, я не хочу, чтобы столбец «дата» выглядел так, а чтобы он был заполнен значениями, которые я получил из исходной функции strptime.


person Gin_Salmon    schedule 11.05.2016    source источник
comment
удалить solarX внутри strptime   -  person SymbolixAU    schedule 11.05.2016
comment
да, что сказал @HubertL.   -  person SymbolixAU    schedule 11.05.2016
comment
Обратите внимание, что data.table не любит POSIXlt. Они потребляют огромное количество памяти. Почему не as.POSIXct?   -  person MichaelChirico    schedule 11.05.2016
comment
@MichaelChirico - я думаю, что data.table преобразует его в POSIXct внутренне (и предупреждает вас, что он это сделал).   -  person SymbolixAU    schedule 11.05.2016
comment
На самом деле, from ?data.table: POSIXlt не поддерживается как тип столбца, потому что он использует 40 байтов для хранения одной даты и времени. Они неявно преобразуются в тип POSIXct с предупреждением. Вместо этого вас также может заинтересовать IDateTime; у него есть методы для преобразования в POSIXlt и обратно.   -  person MichaelChirico    schedule 11.05.2016
comment
Привет @HubertL и @Symbolix, я попробовал ваши предложения: solarX[, date := strptime(MEASDATE, "%d/%m/%Y %H:%M")] Warning message: In [.data.table(solarX, , :=(date, strptime(MEASDATE, "%d/%m/%Y %H:%M"))) : Supplied 11 items to be assigned to 17568 items of column 'date' (recycled leaving remainder of 1 items). Я все еще делаю что-то не так?   -  person Gin_Salmon    schedule 11.05.2016
comment
Есть что-то странное со столбцом MEASDATE, который, кажется, содержит только 11 элементов (даже 6, если вы посмотрите на результат strptime(solarX[,MEASDATE], "%d/%m/%Y %H:%M")) по сравнению с 17568, которые находятся в остальных столбцах data.frame.   -  person HubertL    schedule 11.05.2016


Ответы (1)


Вы не можете использовать POSIXlt в data.table, вместо этого используйте POSIXct:

library(data.table)
## setting up the data
solarX <- fread('MEASDATE      rrp exp_kwh  
"1/05/2015 0:00" 33.99299 0
"1/05/2015 0:30" 31.53335 0
"1/05/2015 1:00" 29.37092 0
"1/05/2015 1:30" 28.03197 0
"1/05/2015 2:00" 26.82800 0
"1/05/2015 2:30" 25.22149 0')

solarX[, date := as.POSIXct(MEASDATE, format = "%d/%m/%Y %H:%M")]

#           MEASDATE      rrp exp_kwh                date
# 1: 1/05/2015 0:00 33.99299       0 2015-05-01 00:00:00
# 2: 1/05/2015 0:30 31.53335       0 2015-05-01 00:30:00
# 3: 1/05/2015 1:00 29.37092       0 2015-05-01 01:00:00
# 4: 1/05/2015 1:30 28.03197       0 2015-05-01 01:30:00
# 5: 1/05/2015 2:00 26.82800       0 2015-05-01 02:00:00
# 6: 1/05/2015 2:30 25.22149       0 2015-05-01 02:30:00

str(solarX)
Classes ‘data.table’ and 'data.frame':  6 obs. of  4 variables:
 $ MEASDATE: chr  "1/05/2015 0:00" "1/05/2015 0:30" "1/05/2015 1:00" "1/05/2015 1:30" ...
 $ rrp    : num  34 31.5 29.4 28 26.8 ...
 $ exp_kwh: int  0 0 0 0 0 0
 $ date   : POSIXct, format: "2015-05-01 00:00:00" "2015-05-01 00:30:00" "2015-05-01 01:00:00" "2015-05-01 01:30:00" ...
 - attr(*, ".internal.selfref")=<externalptr> 
person SymbolixAU    schedule 11.05.2016
comment
Я не понимаю, как вы получили этот результат. Помимо вашего gsub с _, который приводит к тому же столбцу MEASDATE, что и у меня, нужно ли мне что-то еще менять, чтобы воспроизвести это? - person Gin_Salmon; 11.05.2016
comment
@Gin_Salmon все, вплоть до строки gsub включительно, - это просто я получаю данные в свою среду, взятые из предоставленных вами данных. Строка solarX[, date := ...] – это единственная строка, которая вам должна понадобиться. - person SymbolixAU; 11.05.2016