2
votes

Comment créer une nouvelle colonne «décalage horaire» à partir des colonnes d'heure de début et de fin dans une table R

J'ai reçu un tableau de données à analyser. J'ai une colonne avec les heures de début et une colonne avec les heures de fin données en 3 ou 4 chiffres, exemple: 15h40 est 1540, 7h25 est 725.

Comment puis-je obtenir une nouvelle colonne dans mon tableau avec la différence de ces temps, exprimés en minutes? Il y a plus de 2000 entrées.

Merci pour toute aide.

structure(list(schedtime = c(1455L, 1640L, 1245L, 1715L, 1039L, 
840L), deptime = c(1455L, 1640L, 1245L, 1709L, 1035L, 839L), 
distance = c(184L, 213L, 229L, 229L, 229L, 228L), flightnumber = 
c(5935L, 
6155L, 7208L, 7215L, 7792L, 7800L), weather = c(0L, 0L, 0L, 
0L, 0L, 0L), dayweek = c(4L, 4L, 4L, 4L, 4L, 4L), daymonth = c(1L, 
1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 6L), class = "data.frame")

Ceci est un exemple de l'ensemble de données (je ne sais pas pourquoi il y a des L après chaque nombre, ceux-ci ne sont pas indiqués dans le tableau). Je veux, en minutes, deptime (finish) - schedtime (start).

Étant donné la nouvelle colonne, il y a 2 valeurs avec un schedtime avant minuit et un deptime après minuit, par exemple schedtime 2120 et deptime 0010 La réponse à cela est donnée en -1270, considérant que c'est un départ extrêmement précoce. Comment puis-je modifier ce paramètre pour qu'il soit calculé comme +170, un départ tardif?


2 commentaires

Veuillez mettre à jour votre question avec des exemples de données en utilisant dput


Quelle est l'attente de production?


4 Réponses :


0
votes
dat <- data.frame(c(1540,1820,1330,545,100),c(1850,2150,2325,1330,101))
60*(floor(dat[,2]/100) - floor(dat[,1]/100)) - dat[,1] %% 100 + dat[,2] %% 100
Taking the floor of the the hundreds gives the hours. Taking the difference and multiplying by 60 gives the minutes from the difference of the hours. Then you can subtract the original minutes and add the final minutes to get total minutes passed.

1 commentaires

Y aurait-il un moyen de calculer en bas des colonnes et de créer une nouvelle colonne avec les réponses?



0
votes

Vous pouvez utiliser la fonction Lubridate de bibliothèque pour trouver la différence en quelques minutes. J'espère que cela t'aides. lubridate fournit de très bonnes fonctionnalités pour les données liées au temps.

df <- structure(list(schedtime = c(1455L, 1640L, 1245L, 1715L, 1039L, 
                                   840L), deptime = c(1455L, 1640L, 1245L, 1709L, 1035L, 839L), 
                     distance = c(184L, 213L, 229L, 229L, 229L, 228L), flightnumber = 
                       c(5935L, 
                         6155L, 7208L, 7215L, 7792L, 7800L), weather = c(0L, 0L, 0L, 
                                                                         0L, 0L, 0L), dayweek = c(4L, 4L, 4L, 4L, 4L, 4L), daymonth = c(1L, 
                                                                                                                                        1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 6L), class = "data.frame")

Données

library(lubridate)
df$deptime_new <- minutes(df$deptime-df$schedtime)


2 commentaires

Avec cela, j'obtiens l'erreur: l'objet de type 'fermeture' n'est pas sous-insérable


Cela donne des réponses incorrectes, par exemple 1730 - 1600 = 130 minutes, mais c'est en fait 90 minutes.



0
votes

Moyen efficace pour un ensemble de données plus volumineux -

library(data.table)
library(stringr)
setDT(dt)
dt[,schedtime:=str_pad(schedtime, 4, pad = "0")]
dt[,deptime:=str_pad(deptime, 4, pad = "0")]

dt[,time_diff:=difftime(as.ITime(strptime(x = schedtime, format = "%H%M")),as.ITime(strptime(x = deptime, format = "%H%M")),units = "mins")]


> dt
   schedtime deptime distance flightnumber weather dayweek daymonth time_diff
1:      1455    1455      184         5935       0       4        1    0 mins
2:      1640    1640      213         6155       0       4        1    0 mins
3:      1245    1245      229         7208       0       4        1    0 mins
4:      1715    1709      229         7215       0       4        1    6 mins
5:      1039    1035      229         7792       0       4        1    4 mins
6:      1730    1600      228         7800       0       4        1   90 mins

MODIFIER- (Pour gérer des cas comme 1730 - 1600 = 130 minutes (en fait, c'est 90 minutes).

/ p>

data.table::setDT(dt)[,time_diff:=minutes(deptime-schedtime)]

> dt
   schedtime deptime distance flightnumber weather dayweek daymonth time_diff
1:      1455    1455      184         5935       0       4        1        0S
2:      1640    1640      213         6155       0       4        1        0S
3:      1245    1245      229         7208       0       4        1        0S
4:      1715    1709      229         7215       0       4        1    -6M 0S
5:      1039    1035      229         7792       0       4        1    -4M 0S
6:       840     839      228         7800       0       4        1    -1M 0S


12 commentaires

Erreur dans data.table :: setDT (dt): impossible de convertir «dt» en data.table par référence car la liaison est verrouillée. Il est très probable que «dt» réside dans un package (ou un environnement) qui est verrouillé pour éviter de modifier ses liaisons de variables. Essayez de copier l'objet dans votre environnement actuel, ex: var <- copy (var), puis utilisez à nouveau setDT. J'obtiens cette erreur, savez-vous comment y remédier? Merci de votre aide.


oh, vous pouvez supprimer dt et redémarrer la session R ou vous pouvez copier dt vers un nouvel objet comme dt_copy <- copy (dt) puis setDT (dt_copy)


Quel package dois-je télécharger pour la fonction de copie?


c'est une fonction du package data.table


avez-vous installé le package data.table ?


J'ai ce package mais j'obtiens une erreur: impossible de trouver la fonction "copie"


ce n'est pas possible, quelle version du package data.table utilisez-vous? Aussi, avez-vous fait bibliothèque (data.table)


Je n'ai pas fait de bibliothèque (data.table), la fonction de copie fonctionne maintenant. Désolé, je suis très nouveau dans R. J'obtiens maintenant l'erreur: Erreur dans data.table :: setDT (dt_copy): L'argument 'x' à 'setDT' doit être une 'liste', 'data.frame' ou 'data .table'


avez-vous créé dt_copy à partir de dt ?


J'ai fait. Cela donne des réponses incorrectes, par exemple 1730 - 1600 = 130 minutes, mais c'est en fait 90 minutes.


Ajout d'une nouvelle réponse, veuillez vérifier.


Cela fonctionne très bien, merci. Comment géreriez-vous une valeur de 2120 à 0010? Actuellement, le code considère qu'il s'agit d'un retard négatif (précoce) -1270, mais je voudrais qu'il soit 170. Je comprends que c'est un problème de ne pas avoir les dates. Il y a peu de ces problèmes, y a-t-il un moyen de les changer chacun manuellement?



-1
votes

J'ai la même requête, existe-t-il un moyen de calculer le décalage horaire des heures dans une colonne et d'afficher les réponses dans une nouvelle colonne en minutes


1 commentaires

Veuillez utiliser la section des commentaires car ce n'est pas une réponse.