4 votes

convertir les données pluviométriques horaires en données quotidiennes dans un intervalle de temps spécifique

J'ai des données horaires de pluie et de température pour une longue période. Je voudrais obtenir des valeurs journalières à partir des données horaires. Je considère que les valeurs journalières vont de 07:00:00 à 07:00:00 le jour suivant.

Pourriez-vous me dire comment convertir des données horaires en données quotidiennes entre des intervalles de temps spécifiques ?

exemple : 07:00:00 to 07:00:00 o 12:00:00 to 12:00:00 )

Les données sur les précipitations ressemblent :

1970-01-05 00:00:00      1.0 
1970-01-05 01:00:00      1.0
1970-01-05 02:00:00      1.0
1970-01-05 03:00:00      1.0
1970-01-05 04:00:00      1.0
1970-01-05 05:00:00      3.6
1970-01-05 06:00:00      3.6
1970-01-05 07:00:00      2.2
1970-01-05 08:00:00      2.2
1970-01-05 09:00:00      2.2
1970-01-05 10:00:00      2.2
1970-01-05 11:00:00      2.2
1970-01-05 12:00:00      2.2
1970-01-05 13:00:00      2.2
1970-01-05 14:00:00      2.2
1970-01-05 15:00:00      2.2
1970-01-05 16:00:00      0.0
1970-01-05 17:00:00      0.0
1970-01-05 18:00:00      0.0
1970-01-05 19:00:00      0.0
1970-01-05 20:00:00      0.0
1970-01-05 21:00:00      0.0
1970-01-05 22:00:00      0.0
1970-01-05 23:00:00      0.0
1970-01-06 00:00:00      0.0

5voto

Ananda Mahto Points 67213

D'abord, créez des données reproductibles pour que nous puissions mieux vous aider :

require(xts)
set.seed(1)
X = data.frame(When = as.Date(seq(from = ISOdatetime(2012, 01, 01, 00, 00, 00),
                                  length.out = 100, by="1 hour")),
               Measurements = sample(1:20, 100, replace=TRUE))

Nous disposons maintenant d'un cadre de données avec 100 observations horaires dont les dates débutent à 2012-01-01 00:00:00 et se terminent à 2012-01-05 03:00:00 (l'heure est au format 24 heures).

Ensuite, il faut le convertir en un objet XTS.

X2 = xts(X$Measurements, order.by=X$When)

Troisièmement, apprenez à sous-titrer une fenêtre temporelle spécifique.

X2['T04:00/T08:00']
#                     [,1]
# 2012-01-01 04:00:00    5
# 2012-01-01 05:00:00   18
# 2012-01-01 06:00:00   19
# 2012-01-01 07:00:00   14
# 2012-01-01 08:00:00   13
# 2012-01-02 04:00:00   18
# 2012-01-02 05:00:00    7
# 2012-01-02 06:00:00   10
# 2012-01-02 07:00:00   12
# 2012-01-02 08:00:00   10
# 2012-01-03 04:00:00    9
# 2012-01-03 05:00:00    5
# 2012-01-03 06:00:00    2
# 2012-01-03 07:00:00    2
# 2012-01-03 08:00:00    7
# 2012-01-04 04:00:00   18
# 2012-01-04 05:00:00    8
# 2012-01-04 06:00:00   16
# 2012-01-04 07:00:00   20
# 2012-01-04 08:00:00    9

Quatrièmement, utilisez ces informations avec apply.daily et la fonction que vous voulez, comme suit :

apply.daily(X2['T04:00/T08:00'], mean)
#                     [,1]
# 2012-01-01 08:00:00 13.8
# 2012-01-02 08:00:00 11.4
# 2012-01-03 08:00:00  5.0
# 2012-01-04 08:00:00 14.2

Mise à jour : points de terminaison personnalisés

Après avoir relu votre question, je vois que j'ai mal interprété ce que vous vouliez.

Il semble que vous vouliez prendre la moyenne d'une période de 24 heures, pas nécessairement de minuit à minuit.

Pour cela, vous devez vous débarrasser apply.daily et à la place, utilisez period.apply avec une personnalisation endpoint comme ceci :

# You want to start at 7AM. Find out which record is the first one at 7AM.
A = which(as.character(index(X2)) == "2012-01-01 07:00:00")

# Use that to create your endpoints. 
# The ends of the endpoints should start at 0 
# and end at the max number of records.
ep = c(0, seq(A, 100, by=24), 100)
period.apply(X2, INDEX=ep, FUN=function(x) mean(x))
#                         [,1]
# 2012-01-01 07:00:00 12.62500
# 2012-01-02 07:00:00 10.08333
# 2012-01-03 07:00:00 10.79167
# 2012-01-04 07:00:00 11.54167
# 2012-01-05 03:00:00 10.25000

2voto

Pop Points 1800

Vous pouvez utiliser ce code :

fun <- function(s,i,j) { sum(s[i:(i+j-1)]) }
sapply(X=seq(1,24*nb_of_days,24),FUN=fun,s=your_time_serie,j=24)

Il suffit de changer 1 par une autre valeur pour avoir un intervalle de temps différent : 8 of 07:00:00 to 07:00:00 ou 13 pour 12:00:00 to 12:00:00

1voto

Roland Points 37641

Étape 1 : transformer la date en POSIXct

ttt <- as.POSIXct("1970-01-05 08:00:00",tz="GMT")
ttt
#"1970-01-05 08:00:00 GMT"

Étape 2 : soustraire la différence de temps de 7 heures.

ttt <- ttt-as.difftime(7,units="hours")
ttt
#"1970-01-05 01:00:00 GMT"

Étape 3 : troncature en jours

ttt<-trunc(ttt,"days")
ttt
#"1970-01-05 GMT"

Étape 4 : utilisez plyr, data.table ou toute autre méthode que vous préférez pour calculer les moyennes journalières.

0voto

Dan Points 1056

Utilisation de expressions régulières devrait vous donner ce dont vous avez besoin. Sélectionnez les lignes qui correspondent à vos besoins et additionnez les valeurs. Faites-le pour chaque jour de votre plage horaire et vous êtes prêt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X