2017-06-21 1 views
0

Quand on prend la différence de deux temps, il y a quelque chose qui se passe automatiquement là en unités.Lubrifier fixer les unités de temps

> ymd_hms("2016-05-09 15:17:03") - ymd_hms("2016-05-09 15:17:04") 
Time difference of -1 secs 
> ymd_hms("2016-05-09 16:17:03") - ymd_hms("2016-05-09 15:17:04") 
Time difference of 59.98333 mins 
> ymd_hms("2016-05-10 16:17:03") - ymd_hms("2016-05-09 15:17:04") 
Time difference of 1.041655 days 

Comment puis-je fixer les unités sans utiliser difftime fonction.

Je peux donc faire ce qui suit:

VECTOR = c(ymd_hms("2016-05-10 16:17:03"), 
      ymd_hms("2016-05-10 17:19:33"), 
      ymd_hms("2016-05-10 19:55:03") 
     ) 

diffs = diff(VECTOR) 

IntervalsInHours = toHours(diffs) 

De plus, est-il possible de connaître les unités utilisées dans un objet temps lubridate. Par exemple,

> ymd_hms("2016-05-09 15:17:03") - ymd_hms("2016-05-09 15:17:04") 
Time difference of -1 secs 

Les unités utilisées ici sont seconds.

+0

multipliez par 24 pour obtenir des heures –

+0

Quel serait votre rendement attendu? Voulez-vous la sortie de tous les exemples ci-dessus en heures? –

+0

Je veux utiliser la fonction 'diff' pour prendre les différences de temps d'un vecteur de points temporels, seulement dans les unités spécifiées. – John

Répondre

1

« vous voulez utiliser la fonction diff pour prendre les différences de temps entre un des éléments VECTOR, seulement dans les unités spécifiées »

pls essayer sous le code: (par la fonction int_diff)

> VECTOR = c(ymd_hms("2016-05-10 16:17:03"), 
+   ymd_hms("2016-05-10 16:17:04"), 
+   ymd_hms("2016-05-10 17:19:33"), 
+   ymd_hms("2016-05-10 19:55:03") 
+) 
> as.numeric(int_diff(VECTOR)) 
[1] 1 3749 9330 
> round(as.numeric(int_diff(VECTOR))/3600,2) 
[1] 0.00 1.04 2.59 

voir, quel que soit l'intervalle de temps, l'unité min est la seconde ou non , il est toujours mis à l'échelle par secondes comme ci-dessous.

> VECTOR = c(ymd_hms("2016-05-10 16:17:03"), 
+   #ymd_hms("2016-05-10 16:17:04"), 
+   ymd_hms("2016-05-10 17:19:33"), 
+   ymd_hms("2016-05-10 19:55:03") 
+) 
> as.numeric(int_diff(VECTOR)) 
[1] 3750 9330 
> round(as.numeric(int_diff(VECTOR))/3600,2) 
[1] 1.04 2.59 
1

veuillez essayer ci-dessous pour transformer le décalage horaire en heures.

library(lubridate) 
x=ymd_hms("2016-05-09 16:17:03") 
y=ymd_hms("2016-05-19 15:17:04") 
diffs=as.duration(x-y) 
IntervalsInHours=as.numeric(abs(diffs))/3600;IntervalsInHours 
1

ou vous pouvez utiliser cette façon:

library(lubridate) 
x=ymd_hms("2016-05-09 16:17:03") 
y=ymd_hms("2016-05-19 16:17:04") 
diffs=as.duration(x-y); 
IntervalsInHours=abs(diffs)/dhours(1);IntervalsInHours 
0

J'ai écrit deux fonctions au cas où quelqu'un pourrait trouver utile.

timeDiffUnitConvert = function(Diffs, to="day", roundingN = 1){  
    if(to == "day"){ 
    R = round(as.numeric(as.duration(Diffs))/3600/24,roundingN) 
    } else if (to == "hour") { 
    R = round(as.numeric(as.duration(Diffs))/3600, roundingN) 
    } else if (to == "min") { 
    R = round(as.numeric(as.duration(Diffs))/60, roundingN) 
    } else if (to == "sec"){ 
    R = round(as.numeric(as.duration(Diffs)), roundingN) 
    } else { 
    stop("to which unit? it must be `day`, `hour`, `min` or `sec`.") 
    } 
    R 
} 

timeDiffVector = function(TimeVector, to="day", roundingN = 1, attachNaMode = "none"){ 
    R = timeDiffUnitConvert(diff(TimeVector), to = to, roundingN = roundingN) 
    if(attachNaMode == "leading"){ 
    R = c(NA,R) 
    } else if(attachNaMode == "trailing"){ 
    R = c(R,NA) 
    } else{ 
    stop("check your attachNaMode: shall be either `leading` or `trailing`") 
    } 
    R 
}