Попробуй это. (Здесь мы используем, text=Lines
чтобы пример оставался самодостаточным, но на самом деле мы бы заменили его именем файла.)
Lines <- "2009-01 12
2009-02 310
2009-03 2379
2009-04 234
2009-05 14
2009-08 1
2009-09 34
2009-10 2386"
library(zoo)
z <- read.zoo(text = Lines, FUN = as.yearmon)
plot(z)
Ось X не так хороша с этими данными, но если у вас есть больше данных на самом деле, это может быть нормально, или вы можете использовать код для причудливой оси X, показанный в разделе примеров ?plot.zoo
.
Созданная выше серия зоопарка z
имеет "yearmon"
временной индекс и выглядит следующим образом:
> z
Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009
12 310 2379 234 14 1 34 2386
"yearmon"
можно использовать отдельно:
> as.yearmon("2000-03")
[1] "Mar 2000"
Заметка:
"yearmon"
объекты класса сортируются в календарном порядке.
Это будет отображать ежемесячные точки с одинаковыми интервалами, что, вероятно, и нужно; Однако, если бы это было желательно , чтобы построить точки на неравных интервалах , разнесенных пропорционально количество дней в каждом месяце затем конвертировать индекс z
в "Date"
класс: time(z) <- as.Date(time(z))
.
as.Date(month, format='%Y-%m-01')
и добиться того же результата. Для меня это «кажется» предпочтительным, поскольку указание одной и той же даты в каждом месяце больше связано с форматом даты, чем с манипуляциями со строками, но, возможно, это ерунда.> as.Date("2016-01", format="%Y-%m-01") # [1] NA
. Я использую R 3.3.1Самое краткое решение, если вам нужно, чтобы даты были в формате даты:
library(zoo) month <- "2000-03" as.Date(as.yearmon(month)) [1] "2000-03-01"
as.Date
зафиксирует для вас первый день каждого месяца в объекте yearmon.источник
Вы также можете добиться этого с помощью функций
parse_date_time
илиfast_strptime
изlubridate
-package:> parse_date_time(dates1, "ym") [1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC" > fast_strptime(dates1, "%Y-%m") [1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"
Разница между этими двумя
parse_date_time
форматами заключается в том, что они допускают спецификацию формата в стиле lubridate, ноfast_strptime
требуют той же спецификации формата, что иstrptime
.Для указания часового пояса вы можете использовать параметр
tz
-параметр:> parse_date_time(dates1, "ym", tz = "CET") [1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"
Когда у вас есть нарушения в данных даты и времени, вы можете использовать параметр
truncated
-параметр, чтобы указать, сколько нарушений разрешено:> parse_date_time(dates2, "ymdHMS", truncated = 3) [1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC"
Используемые данные:
dates1 <- c("2009-01","2009-02","2009-03") dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01")
источник
date
с помощьюparse_date_time
, есть ли способ просмотреть ее в другом порядке, чем"2009-01-01 UTC"
при использованииlubridate
пакета? Я бы предпочел видеть день первым в моем наборе данных, например01-01-2009
.?format
; например:format(your_date, "%d-%m-%Y")
. Однако у этого есть недостаток: вы получите обратно значение символа, а не дату.format
по указанной вами причине, я думал, что есть способ включить это вlubridate
пакет, но, похоже, его нет.Использование пакета в любое время :
library(anytime) anydate("2009-01") # [1] "2009-01-01"
источник
anydate("2009-03")
всегда ли он выбирает первый день месяца.?strptime
: во входной строке не требуется указывать дату полностью: предполагается, что неуказанные секунды, минуты или часы равны нулю, а неуказанный год, месяц или день являются текущими. (Однако, если указан месяц, день этого месяца должен быть указан% d или% e, поскольку текущий день месяца не обязательно должен быть действительным для указанного месяца.) Похоже, что ответ мегатрона содержит аналогичный фрагмент документации отas.Date
.anytime('1870-01')
В самом деле, как уже упоминалось выше (и в других местах на SO), для преобразования строки в дату вам нужна конкретная дата месяца. На
as.Date()
странице руководства:Простым решением было бы вставить дату
"01"
в каждую дату и использовать ееstrptime()
для обозначения первого дня этого месяца.Для тех, кто хочет получить дополнительную информацию о датах и времени обработки в R:
В R время используется,
POSIXct
аPOSIXlt
классы и даты используютDate
класс.Даты хранятся как количество дней с 1 января 1970 года, а время - как количество секунд с 1 января 1970 года.
Так, например:
d <- as.Date("1971-01-01") unclass(d) # one year after 1970-01-01 # [1] 365 pct <- Sys.time() # in POSIXct unclass(pct) # number of seconds since 1970-01-01 # [1] 1450276559 plt <- as.POSIXlt(pct) up <- unclass(plt) # up is now a list containing the components of time names(up) # [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" "zone" # [11] "gmtoff" up$hour # [1] 9
Для выполнения операций с датой и временем:
plt - as.POSIXlt(d) # Time difference of 16420.61 days
А для обработки дат вы можете использовать
strptime()
(заимствуя эти примеры из справочной страницы):strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS") # [1] "2006-02-20 11:16:16 EST" # And in vectorized form: dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960") strptime(dates, "%d%b%Y") # [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"
источник
Я думаю, что решение @Ben-Roller - хорошее решение.
Вам просто нужно быть осторожным, если вы хотите использовать это решение в функции внутри нового пакета.
При разработке пакетов рекомендуется использовать синтаксис
packagename::function_name()
(см. Http://kbroman.org/pkg_primer/pages/depends.html ).В этом случае вы должны использовать версию,
as.Date()
определеннуюzoo
библиотекой.Вот пример:
> devtools::session_info() Session info ---------------------------------------------------------------------------------------------------------------------------------------------------- setting value version R version 3.3.1 (2016-06-21) system x86_64, linux-gnu ui RStudio (1.0.35) language (EN) collate C tz <NA> date 2016-11-09 Packages -------------------------------------------------------------------------------------------------------------------------------------------------------- package * version date source devtools 1.12.0 2016-06-24 CRAN (R 3.3.1) digest 0.6.10 2016-08-02 CRAN (R 3.2.3) memoise 1.0.0 2016-01-29 CRAN (R 3.2.3) withr 1.0.2 2016-06-20 CRAN (R 3.2.3) > as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : do not know how to convert 'zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date” > zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) [1] "1989-10-01"
Поэтому, если вы разрабатываете пакет, рекомендуется использовать:
zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
источник