Coba ini. (Di sini kami menggunakan text=Lines
untuk menyimpan contoh itu sendiri tetapi pada kenyataannya kami akan menggantinya dengan nama file.)
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)
Sumbu X tidak begitu cantik dengan data ini tetapi jika Anda memiliki lebih banyak data pada kenyataannya itu mungkin baik-baik saja atau Anda dapat menggunakan kode untuk sumbu X mewah yang ditunjukkan pada bagian contoh ?plot.zoo
.
Rangkaian kebun binatang z
,, yang dibuat di atas memiliki "yearmon"
indeks waktu dan terlihat seperti ini:
> 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"
bisa digunakan sendiri juga:
> as.yearmon("2000-03")
[1] "Mar 2000"
catatan:
"yearmon"
objek kelas mengurutkan dalam urutan kalender.
Ini akan memplot poin bulanan pada interval jarak yang sama yang mungkin diinginkan; Namun, jika hal itu diinginkan untuk merencanakan poin pada interval merata spasi spasi secara proporsional dengan jumlah hari dalam setiap bulan kemudian mengubah indeks dari z
ke "Date"
kelas: time(z) <- as.Date(time(z))
.
as.Date(month, format='%Y-%m-01')
dan mencapai hasil yang sama. Ini "terasa" lebih disukai bagi saya karena menentukan tanggal yang sama di setiap bulan lebih banyak tentang format tanggal kemudian manipulasi string, tapi mungkin itu tidak masuk akal.> as.Date("2016-01", format="%Y-%m-01") # [1] NA
. Saya menggunakan R 3.3.1Solusi paling ringkas jika Anda membutuhkan tanggal dalam format Tanggal:
library(zoo) month <- "2000-03" as.Date(as.yearmon(month)) [1] "2000-03-01"
as.Date
akan memperbaiki hari pertama setiap bulan menjadi objek yearmon untuk Anda.sumber
Anda juga bisa mencapai ini dengan fungsi
parse_date_time
ataufast_strptime
darilubridate
-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"
Perbedaan antara keduanya adalah
parse_date_time
memungkinkan untuk spesifikasi format gaya lubridate, sedangkanfast_strptime
membutuhkan spesifikasi format yang sama sepertistrptime
.Untuk menentukan zona waktu, Anda dapat menggunakan
tz
-parameter:> parse_date_time(dates1, "ym", tz = "CET") [1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"
Jika Anda memiliki data tanggal-waktu yang tidak teratur, Anda dapat menggunakan
truncated
-parameter untuk menentukan berapa banyak penyimpangan yang diperbolehkan:> 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"
Data yang digunakan:
dates1 <- c("2009-01","2009-02","2009-03") dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01")
sumber
date
menggunakanparse_date_time
, apakah ada cara untuk melihatnya dalam urutan yang berbeda daripada"2009-01-01 UTC"
menggunakanlubridate
paket? Saya lebih suka melihat hari pertama di kumpulan data saya misalnya01-01-2009
.?format
; misformat(your_date, "%d-%m-%Y")
. : . Ada kerugian untuk ini: Anda akan mendapatkan nilai karakter kembali dan bukan tanggal.format
alasan yang Anda sebutkan, saya pikir mungkin ada cara untuk memasukkan ini ke dalamlubridate
paket tetapi sepertinya tidak ada.Menggunakan paket kapan saja :
library(anytime) anydate("2009-01") # [1] "2009-01-01"
sumber
anydate("2009-03")
jika selalu memilih hari pertama setiap bulan.?strptime
: string input tidak perlu menentukan tanggal sepenuhnya: diasumsikan bahwa detik, menit, atau jam yang tidak ditentukan adalah nol, dan tahun, bulan, atau hari yang tidak ditentukan adalah yang sekarang. (Namun, jika satu bulan ditentukan, hari dalam bulan itu harus ditentukan oleh% d atau% e karena hari saat ini pada bulan tersebut tidak perlu valid untuk bulan yang ditentukan.) Sepertinya jawaban megatron berisi bagian yang serupa dokumentasi darias.Date
.anytime('1870-01')
Memang, seperti yang telah disebutkan di atas (dan di tempat lain di SO), untuk mengubah string menjadi tanggal, Anda memerlukan tanggal tertentu dalam sebulan. Dari
as.Date()
halaman manual:Solusi sederhana adalah menempelkan tanggal
"01"
ke setiap tanggal dan digunakanstrptime()
untuk menunjukkannya sebagai hari pertama bulan itu.Bagi mereka yang mencari sedikit lebih banyak latar belakang tentang pemrosesan tanggal dan waktu di R:
Di R, waktu penggunaan
POSIXct
danPOSIXlt
kelas serta tanggal menggunakanDate
kelas.Tanggal disimpan sebagai jumlah hari sejak 1 Januari 1970 dan waktu disimpan sebagai jumlah detik sejak 1 Januari 1970.
Jadi, misalnya:
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
Untuk melakukan operasi pada tanggal dan waktu:
plt - as.POSIXlt(d) # Time difference of 16420.61 days
Dan untuk memproses tanggal, Anda dapat menggunakan
strptime()
(meminjam contoh ini dari halaman manual):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"
sumber
Saya pikir solusi @ ben-rollert adalah solusi yang baik.
Anda hanya perlu berhati-hati jika ingin menggunakan solusi ini dalam fungsi di dalam paket baru.
Saat mengembangkan paket, disarankan untuk menggunakan sintaks
packagename::function_name()
(lihat http://kbroman.org/pkg_primer/pages/depends.html ).Dalam kasus ini, Anda harus menggunakan versi yang
as.Date()
ditentukan olehzoo
pustaka.Berikut ini contohnya:
> 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"
Jadi jika Anda mengembangkan sebuah paket, praktik yang baik adalah menggunakan:
zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
sumber