2015-07-10 39 views
7

Ben gibi + ve - işaretlere sahip zamansal kaymaları temsil eden dizeleri, adres:R'de as.dfftime +/- işareti nasıl tanımlanır?

string1 <- c("+00:30", "-07:00")

nasıl bu as.difftime biçimine dönüştürebilirsiniz? Herhangi bir işaret olmasaydı, as.difftime(string1, format = "%H:%M") yazabilirdim ve işe yarayacaktı. Ancak, işaretlerin nasıl ele alınacağını bilmiyorum. UTC zamanını LST'ye dönüştürmek için sonuçlanan difftime'u kullanmak istiyorum.

Zaman ayırdığınız için teşekkür ederim.

+1

Ha, sanmıyorum (şaşırtıcı)! Tabelayı çıkarmanız ve "ifelse"/'grep 'fancyfooting yapıp işareti geri almak zorunda kalabilirsiniz ... –

+0

' DateTimeClasses' altında tanımlanan 'gmtoff' var ama tam anlamıyla kullanıldığını hiç görmedim. Yani size bir örnek bile veremedim. –

+0

Teşekkürler, işaret ve sayıları ayırmak için substr komutunu kullandım ve daha sonra as.difftime – newbie

cevap

0

Bunu as.difftime ve format = "%z" kullanarak yapmak mümkündür, ancak birkaç sorun vardır. İlk olarak, kolon bir saat dilimi belirticisinin geçerli bir parçası değildir. İkincisi, çıktı mevcut saat diliminize göre görünüyor. İşte o yuvarlak alan bir fonksiyon var: Bu sadece mevcut Ar fazla 14 saat farklılıkları (eski sürümlerinde daha az) için çalışacak

tz_to_difftime <- function(x, zero = "+0000") { 
    out <- as.difftime(c(zero, gsub("[: ]", "", x)), 
        format = "%z") 
    out[1] - out[-1] 
} 
tz_to_difftime("+05:30") 

Not söyledi.

İşte strsplit kullanarak bir alternatiftir:

tz_to_difftime2 <- function(x) { 
    as.difftime(sapply(strsplit(x, ":"), 
    function(x) as.numeric(x) %*% c(1, 1/60)), 
    units = "hours") 
} 

Ve eğer şeyler daha pipey gibi (kullanarak magtittr)

tz_to_difftime3 <- . %>% 
    strsplit(":") %>% 
    sapply(
    . %>% 
    as.numeric %>% 
    multiply_by_matrix(c(1, 1/60)) 
) %>% 
    as.difftime(unit = "hours") 

Bu son iki saatlerce herhangi bir sayıda alacağım avantajı var .

+0

'u yarattım. Bu, başka bir sayfadan (. [+ -] "," ", x), biçim = = başka bir sayfadan ödünç alınan kısa çözümdür. "% H:% M") * ifelse (grepl ("^ -", x), - 1,1) – newbie

+0

@newbie Bu satırlar boyunca bir şey yaptığınızı düşünmüştüm, ancak alternatifleri incelemek ilginç olacağını düşündüm –

+0

Teşekkürler, gerçekten faydalıdır. – newbie

İlgili konular