Использование strptime для значений NA - PullRequest
0 голосов
/ 13 января 2019

Мне нужно использовать функцию strptime для преобразования меток времени, которые выглядят следующим образом:

Tue Feb 11 12:18:36 +0000 2014
Tue Feb 11 12:23:22 +0000 2014
Tue Feb 11 12:26:26 +0000 2014
Tue Feb 11 12:28:02 +0000 2014

При необходимости я скопировал это в файл csv и прочитал его в R:

timestamp_data <- read.table('timestamp_data.csv')

Затем я попытался преобразовать его в распознанное время, используя:

timestamp_data_formatted <- strptime(timestamp_data[,1], format ="%a %b %d %H:%M:%S %z %Y")

Я все еще получаю значения NA, когда я пытаюсь просмотреть отформатированные данные в R. Я думаю, проблема в том, что когда я просматриваю свои импортированные данные CSV в R, вместо того, чтобы показывать «+0000», он просто показывает 0. Как я могу почини это?

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Я считаю, что пакет lubridate значительно упрощает обработку дат, а read_csv из readr / tidyverse не устанавливает коэффициенты автоматически.

library(lubridate)
library(tidyverse)

timestamp_data <- read_csv('timestamp_data.csv', col_names = FALSE)
timestamp_data$parsed_date <- parse_date_time(timestamp_data$X1, "%a %b %d %H:%M:%S %z %Y")
0 голосов
/ 13 января 2019

Вы используете read.table, а не read.csv. Первая разбивает на пробелы и, таким образом, разбивает дату и время на несколько столбцов:

df <- read.table(text = 'Tue Feb 11 12:18:36 +0000 2014
Tue Feb 11 12:23:22 +0000 2014
Tue Feb 11 12:26:26 +0000 2014
Tue Feb 11 12:28:02 +0000 2014')

df
#>    V1  V2 V3       V4 V5   V6
#> 1 Tue Feb 11 12:18:36  0 2014
#> 2 Tue Feb 11 12:23:22  0 2014
#> 3 Tue Feb 11 12:26:26  0 2014
#> 4 Tue Feb 11 12:28:02  0 2014

str(df)
#> 'data.frame':    4 obs. of  6 variables:
#>  $ V1: Factor w/ 1 level "Tue": 1 1 1 1
#>  $ V2: Factor w/ 1 level "Feb": 1 1 1 1
#>  $ V3: int  11 11 11 11
#>  $ V4: Factor w/ 4 levels "12:18:36","12:23:22",..: 1 2 3 4
#>  $ V5: int  0 0 0 0
#>  $ V6: int  2014 2014 2014 2014

Если вы используете read.csv (с разумными аргументами), это работает:

df <- read.csv(text = 'Tue Feb 11 12:18:36 +0000 2014
Tue Feb 11 12:23:22 +0000 2014
Tue Feb 11 12:26:26 +0000 2014
Tue Feb 11 12:28:02 +0000 2014', header = FALSE, stringsAsFactors = FALSE)

df$datetime <- as.POSIXct(df$V1, format = '%a %b %d %H:%M:%S %z %Y', tz = 'UTC')

df
#>                               V1            datetime
#> 1 Tue Feb 11 12:18:36 +0000 2014 2014-02-11 12:18:36
#> 2 Tue Feb 11 12:23:22 +0000 2014 2014-02-11 12:23:22
#> 3 Tue Feb 11 12:26:26 +0000 2014 2014-02-11 12:26:26
#> 4 Tue Feb 11 12:28:02 +0000 2014 2014-02-11 12:28:02

str(df)
#> 'data.frame':    4 obs. of  2 variables:
#>  $ V1      : chr  "Tue Feb 11 12:18:36 +0000 2014" "Tue Feb 11 12:23:22 +0000 2014" "Tue Feb 11 12:26:26 +0000 2014" "Tue Feb 11 12:28:02 +0000 2014"
#>  $ datetime: POSIXct, format: "2014-02-11 12:18:36" "2014-02-11 12:23:22" ...

Я использую as.POSIXct здесь вместо strptime, потому что первое, как правило, то, что вам нужно, но strptime работает и сейчас.

...