POSIXct'den zaman çıkarma


85

Tarih bölümünü atarak bir dizi POSIXct nesnesinden saati nasıl çıkarabilirim?

Örneğin:

times <- structure(c(1331086009.50098, 1331091427.42461, 1331252565.99979, 
1331252675.81601, 1331262597.72474, 1331262641.11786, 1331269557.4059, 
1331278779.26727, 1331448476.96126, 1331452596.13806), class = c("POSIXct", 
"POSIXt"))

bu tarihlere karşılık gelen:

"2012-03-07 03:06:49 CET" "2012-03-07 04:37:07 CET" 
"2012-03-09 01:22:45 CET" "2012-03-09 01:24:35 CET" 
"2012-03-09 04:09:57 CET" "2012-03-09 04:10:41 CET"
"2012-03-09 06:05:57 CET" "2012-03-09 08:39:39 CET"
"2012-03-11 07:47:56 CET" "2012-03-11 08:56:36 CET"

Şimdi, o zamanlarda ölçülen bir parametre için bazı değerlerim var

val <- c(1.25343125e-05, 0.00022890575, 
         3.9269125e-05, 0.0002285681875, 
         4.26353125e-05, 5.982625e-05, 
         2.09575e-05, 0.0001516951251, 
         2.653125e-05, 0.0001021391875)

Değerin ölçüldüğü belirli güne bakılmaksızın, günün saatine karşı değer grafiğini çizmek istiyorum.

Bunu yapmama izin verecek belirli bir işlev var mı?

Yanıtlar:


117

strftimeVeri saatlerini herhangi bir karakter biçimine dönüştürmek için kullanabilirsiniz :

> t <- strftime(times, format="%H:%M:%S")
> t
 [1] "02:06:49" "03:37:07" "00:22:45" "00:24:35" "03:09:57" "03:10:41"
 [7] "05:05:57" "07:39:39" "06:47:56" "07:56:36"

Ancak verilerinizin grafiğini çizmek istediğiniz için bu pek yardımcı olmuyor. Bir geçici çözüm, tarih öğesini zamanlarınızdan çıkarmak ve ardından tüm saatlerinize aynı tarihi eklemektir:

> xx <- as.POSIXct(t, format="%H:%M:%S")
> xx
 [1] "2012-03-23 02:06:49 GMT" "2012-03-23 03:37:07 GMT"
 [3] "2012-03-23 00:22:45 GMT" "2012-03-23 00:24:35 GMT"
 [5] "2012-03-23 03:09:57 GMT" "2012-03-23 03:10:41 GMT"
 [7] "2012-03-23 05:05:57 GMT" "2012-03-23 07:39:39 GMT"
 [9] "2012-03-23 06:47:56 GMT" "2012-03-23 07:56:36 GMT"

Şimdi bu datetimenesneleri arsanızda kullanabilirsiniz:

plot(xx, rnorm(length(xx)), xlab="Time", ylab="Random value")

görüntü açıklamasını buraya girin


Daha fazla yardım için bkz. ?DateTimeClasses


16

Hile gösteren önceki cevaplar var. Özünde:

  • POSIXctmevcut tüm çizim işlevlerinden yararlanmak için türleri korumalısınız

  • Günlük değişimin altını çizerek tek bir arsa üzerinde birkaç günü 'kaplamak' istiyorsanız, en iyi numara da ...

  • aynı günü empoze edin (ve gerekirse ayı ve hatta yılı, burada durum böyle değil)

bunu, POSIXltgösterimde iken ayın günü ve ay bileşenlerini geçersiz kılarak veya sadece 'deltayı' farklı günler arasında 0: 00: 00'a göre dengeleyerek yapabilirsiniz.

Yani timesve valsıra yardımsever size sağladığı:

## impose month and day based on first obs
ntimes <- as.POSIXlt(times)    # convert to 'POSIX list type'
ntimes$mday <- ntimes[1]$mday  # and $mon if it differs too
ntimes <- as.POSIXct(ntimes)   # convert back

par(mfrow=c(2,1))
plot(times,val)   # old times
plot(ntimes,val)  # new times

bunu orijinal ve değiştirilmiş zaman ölçekleriyle karşılaştırarak verir:

görüntü açıklamasını buraya girin


10

data.tablePaket bir işlevi 'vardır as.ITimebu verimli aşağıda kullanmak yapabilirsiniz',:

library(data.table)
x <- "2012-03-07 03:06:49 CET"
as.IDate(x) # Output is "2012-03-07"
as.ITime(x) # Output is "03:06:49"

4

Tam olarak saat zamanlarıyla ilgili hiçbir şey bulamıyorum, bu yüzden paketin bazı işlevlerini kullanıyorum: yağlama ve gece yarısından beri saniyelerle çalış:

require(lubridate)
clockS = function(t){hour(t)*3600+minute(t)*60+second(t)}
plot(clockS(times),val)

Eksenleri güzel bir şekilde nasıl etiketleyeceğinizi anlamak için bazı eksen kodlarına bakmak isteyebilirsiniz.


Güzel, bakmam gerekecek, lubridateilginç bir paket gibi görünüyor.
nico

4

time_tGece yarısı GMT değeri her zaman bölünebilir gereğidir 86400( 24 * 3600). Geceyarısından beri geçen saniye GMT değeri böyledir time %% 86400.

GMT'deki saat (time %% 86400) / 3600ve bu grafiğin x ekseni olarak kullanılabilir:

plot((as.numeric(times) %% 86400)/3600, val)

görüntü açıklamasını buraya girin

Bir saat dilimini ayarlamak için, saat diliminizin GMT'den önce olduğu saniye sayısını ekleyerek modülü almadan önce zamanı ayarlayın. Örneğin, ABD merkezi yaz saati uygulaması (CDT) GMT'nin 5 saat gerisindedir. CDT'de zamana karşı çizim yapmak için aşağıdaki ifade kullanılır:

plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)

4

Pek çok çözüm sağlandı, ancak bunu paket kronu kullanan görmedim:

hours = times(strftime(times, format="%T"))
plot(val~hours)

(üzgünüm, resim gönderme hakkım yok, kendiniz çizmeniz gerekecek)


1

Bir POSIXct nesnesinden hh: mm :: ss.sssss'i çıkarmak için tidyverse bir yöntem arayanlar için bir güncelleme. Saat diliminin çıktıya dahil edilmediğini unutmayın.

library(hms)
as_hms(times)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.