2016-01-26 4 views
1

Je reconnais depuis le début que je suis nouveau à R avec ma seule autre expérience de "programmation" dans l'environnement MATLAB.R: Problème lors de la conversion de la chaîne au format d'heure correct après avoir exporté les données de SQL

J'ai couru à travers de nombreux messages sur stackoverflow liés à mon problème, mais je n'ai pas encore trouvé un poste qui correspond exactement à mon problème, j'ai donc choisi de le poster ici.

Définition du problème

Après l'exportation de données (qui capture des informations relatives à un appareil de mesure) de SQL dans un fichier de format CSV, I importé les données dans R en utilisant la commande read.table comme suit:

tbl = read.csv("myfile.csv", sep = ",", header = TRUE, stringsAsFactors = FALSE); 

Cela fournit un cadre de données avec plus de 17 000 observations sur 8 variables. Parmi ces 8 variables, seules les 2 dernières (colonnes) sont des intérêts (ReadingTime et lecture) donc je réduis ces trames de données à df comme suit:

df = tbl[,c(7,8)]; 

Aux fins de visualisation, voici ce que les 25 premiers éléments de regarder df comme:

df[c(1:25),] 
       ReadingTime Reading 
1 2015-Dec-31 11:00:00 PM 3.52 
2 2015-Dec-31 10:00:00 PM 3.97 
3 2015-Dec-31 9:00:00 PM 3.85 
4 2015-Dec-31 8:00:00 PM 3.94 
5 2015-Dec-31 7:00:00 PM 4.47 
6 2015-Dec-31 6:00:00 PM 4.75 
7 2015-Dec-31 5:00:00 PM 6.58 
8 2015-Dec-31 4:00:00 PM 6.99 
9 2015-Dec-31 3:00:00 PM 7.50 
10 2015-Dec-31 2:00:00 PM 6.28 
11 2015-Dec-31 1:00:00 PM 6.16 
12 2015-Dec-31 12:00:00 PM 4.49 
13 2015-Dec-31 11:00:00 AM 4.30 
14 2015-Dec-31 10:00:00 AM 4.27 
15 2015-Dec-31 9:00:00 AM 4.54 
16 2015-Dec-31 8:00:00 AM 4.30 
17 2015-Dec-31 7:00:00 AM 4.52 
18 2015-Dec-31 6:00:00 AM 4.65 
19 2015-Dec-31 5:00:00 AM 4.25 
20 2015-Dec-31 4:00:00 AM 4.45 
21 2015-Dec-31 3:00:00 AM 4.26 
22 2015-Dec-31 2:00:00 AM 5.02 
23 2015-Dec-31 1:00:00 AM 5.17 
24    2015-Dec-31 5.44 
25 2015-Dec-30 11:00:00 PM 5.53 

Objectif

Je voudrais convertir maintenant df en un objet XTS avec le format de date heure appropriée pour que je puisse créer des statistiques sommaires et d'effectuer la transformation sur mes données (par exemple. convertissez les séries chronologiques horaires en séries chronologiques quotidiennes, hebdomadaires, etc.) et utilisez finalement l'objet xts dans un exercice de prévision.

Difficultés rencontrées

Lors d'une tentative de convertir les ReadingTime de df (à savoir le temps de date au format de caractères) dans un format de date heure reconnue par XTS je rencontre un problème avec le temps de date qui se produisent à minuit. Un exemple est le suivant:

strptime(df[,1], "%Y-%b-%d %H:%M:%S %p",tz="GMT"); 
    df[c(1:25),1] 
[1] "2015-12-31 11:00:00 GMT" "2015-12-31 10:00:00 GMT" "2015-12-31 09:00:00 GMT" 
[4] "2015-12-31 08:00:00 GMT" "2015-12-31 07:00:00 GMT" "2015-12-31 06:00:00 GMT" 
[7] "2015-12-31 05:00:00 GMT" "2015-12-31 04:00:00 GMT" "2015-12-31 03:00:00 GMT" 
[10] "2015-12-31 02:00:00 GMT" "2015-12-31 01:00:00 GMT" "2015-12-31 12:00:00 GMT" 
[13] "2015-12-31 11:00:00 GMT" "2015-12-31 10:00:00 GMT" "2015-12-31 09:00:00 GMT" 
[16] "2015-12-31 08:00:00 GMT" "2015-12-31 07:00:00 GMT" "2015-12-31 06:00:00 GMT" 
[19] "2015-12-31 05:00:00 GMT" "2015-12-31 04:00:00 GMT" "2015-12-31 03:00:00 GMT" 
[22] "2015-12-31 02:00:00 GMT" "2015-12-31 01:00:00 GMT" NA      
[25] "2015-12-30 11:00:00 GMT" 

Questions:

Mes trois questions sont les suivantes: 1) comment se fait AM/PM n'est pas maintenu - comment peut-il être fixé (ce qui a été adressé par @HubertL ci-dessous); 2) comment surmonter l'AN à [24], et le convertir dans son format approprié? ET 3) comment puis-je transformer df en un objet xts?

Solutions proposées par @HubertL Jusqu'à présent, @HubertL a adressé Q1. La première partie de réponse 2 (A2) tel que proposé par @HubertL sépare les différents composants du ReadingTime et ajoute une autre colonne à df qui ressemble à:

> df[c(1:25),] 
       ReadingTime Reading     dateSplit 
1 2015-Dec-31 11:00:00 PM 3.52 2015-Dec-31, 11:00:00, PM 
2 2015-Dec-31 10:00:00 PM 3.97 2015-Dec-31, 10:00:00, PM 
3 2015-Dec-31 9:00:00 PM 3.85 2015-Dec-31, 9:00:00, PM 
4 2015-Dec-31 8:00:00 PM 3.94 2015-Dec-31, 8:00:00, PM 
5 2015-Dec-31 7:00:00 PM 4.47 2015-Dec-31, 7:00:00, PM 
6 2015-Dec-31 6:00:00 PM 4.75 2015-Dec-31, 6:00:00, PM 
7 2015-Dec-31 5:00:00 PM 6.58 2015-Dec-31, 5:00:00, PM 
8 2015-Dec-31 4:00:00 PM 6.99 2015-Dec-31, 4:00:00, PM 
9 2015-Dec-31 3:00:00 PM 7.50 2015-Dec-31, 3:00:00, PM 
10 2015-Dec-31 2:00:00 PM 6.28 2015-Dec-31, 2:00:00, PM 
11 2015-Dec-31 1:00:00 PM 6.16 2015-Dec-31, 1:00:00, PM 
12 2015-Dec-31 12:00:00 PM 4.49 2015-Dec-31, 12:00:00, PM 
13 2015-Dec-31 11:00:00 AM 4.30 2015-Dec-31, 11:00:00, AM 
14 2015-Dec-31 10:00:00 AM 4.27 2015-Dec-31, 10:00:00, AM 
15 2015-Dec-31 9:00:00 AM 4.54 2015-Dec-31, 9:00:00, AM 
16 2015-Dec-31 8:00:00 AM 4.30 2015-Dec-31, 8:00:00, AM 
17 2015-Dec-31 7:00:00 AM 4.52 2015-Dec-31, 7:00:00, AM 
18 2015-Dec-31 6:00:00 AM 4.65 2015-Dec-31, 6:00:00, AM 
19 2015-Dec-31 5:00:00 AM 4.25 2015-Dec-31, 5:00:00, AM 
20 2015-Dec-31 4:00:00 AM 4.45 2015-Dec-31, 4:00:00, AM 
21 2015-Dec-31 3:00:00 AM 4.26 2015-Dec-31, 3:00:00, AM 
22 2015-Dec-31 2:00:00 AM 5.02 2015-Dec-31, 2:00:00, AM 
23 2015-Dec-31 1:00:00 AM 5.17 2015-Dec-31, 1:00:00, AM 
24    2015-Dec-31 5.44    2015-Dec-31 
25 2015-Dec-30 11:00:00 PM 5.53 2015-Dec-30, 11:00:00, PM 

maintenant lors de l'exécution de la deuxième ligne de code pour A2 je cours dans le problème que la fonction lengths suggéré n'existe pas pour ma version de R (3.1.1), donc j'ai remplacé par la fonction length, est-ce correct?Quoi qu'il en soit le résultat de l'exécution des deuxième et troisième lignes de code pour A2 est la suivante:

> df[c(1:25),] 
       ReadingTime Reading     dateSplit    date 
1 2015-Dec-31 11:00:00 PM 3.52 2015-Dec-31, 11:00:00, PM 2015-12-31 23:00:00 
2 2015-Dec-31 10:00:00 PM 3.97 2015-Dec-31, 10:00:00, PM 2015-12-31 22:00:00 
3 2015-Dec-31 9:00:00 PM 3.85 2015-Dec-31, 9:00:00, PM 2015-12-31 21:00:00 
4 2015-Dec-31 8:00:00 PM 3.94 2015-Dec-31, 8:00:00, PM 2015-12-31 20:00:00 
5 2015-Dec-31 7:00:00 PM 4.47 2015-Dec-31, 7:00:00, PM 2015-12-31 19:00:00 
6 2015-Dec-31 6:00:00 PM 4.75 2015-Dec-31, 6:00:00, PM 2015-12-31 18:00:00 
7 2015-Dec-31 5:00:00 PM 6.58 2015-Dec-31, 5:00:00, PM 2015-12-31 17:00:00 
8 2015-Dec-31 4:00:00 PM 6.99 2015-Dec-31, 4:00:00, PM 2015-12-31 16:00:00 
9 2015-Dec-31 3:00:00 PM 7.50 2015-Dec-31, 3:00:00, PM 2015-12-31 15:00:00 
10 2015-Dec-31 2:00:00 PM 6.28 2015-Dec-31, 2:00:00, PM 2015-12-31 14:00:00 
11 2015-Dec-31 1:00:00 PM 6.16 2015-Dec-31, 1:00:00, PM 2015-12-31 13:00:00 
12 2015-Dec-31 12:00:00 PM 4.49 2015-Dec-31, 12:00:00, PM 2015-12-31 12:00:00 
13 2015-Dec-31 11:00:00 AM 4.30 2015-Dec-31, 11:00:00, AM 2015-12-31 11:00:00 
14 2015-Dec-31 10:00:00 AM 4.27 2015-Dec-31, 10:00:00, AM 2015-12-31 10:00:00 
15 2015-Dec-31 9:00:00 AM 4.54 2015-Dec-31, 9:00:00, AM 2015-12-31 09:00:00 
16 2015-Dec-31 8:00:00 AM 4.30 2015-Dec-31, 8:00:00, AM 2015-12-31 08:00:00 
17 2015-Dec-31 7:00:00 AM 4.52 2015-Dec-31, 7:00:00, AM 2015-12-31 07:00:00 
18 2015-Dec-31 6:00:00 AM 4.65 2015-Dec-31, 6:00:00, AM 2015-12-31 06:00:00 
19 2015-Dec-31 5:00:00 AM 4.25 2015-Dec-31, 5:00:00, AM 2015-12-31 05:00:00 
20 2015-Dec-31 4:00:00 AM 4.45 2015-Dec-31, 4:00:00, AM 2015-12-31 04:00:00 
21 2015-Dec-31 3:00:00 AM 4.26 2015-Dec-31, 3:00:00, AM 2015-12-31 03:00:00 
22 2015-Dec-31 2:00:00 AM 5.02 2015-Dec-31, 2:00:00, AM 2015-12-31 02:00:00 
23 2015-Dec-31 1:00:00 AM 5.17 2015-Dec-31, 1:00:00, AM 2015-12-31 01:00:00 
24    2015-Dec-31 5.44    2015-Dec-31    <NA> 
25 2015-Dec-30 11:00:00 PM 5.53 2015-Dec-30, 11:00:00, PM 2015-12-30 23:00:00 

Vous pouvez voir le NA existe encore [24]. Ce problème entraîne la divulgation de toutes les mesures effectuées à minuit à partir de l'objet xts lorsque j'applique le code proposé pour A3. I.e .:

> df[c(1:25),] 
        [,1] 
2014-01-01 01:00:00 4.67 
2014-01-01 02:00:00 4.78 
2014-01-01 03:00:00 4.87 
2014-01-01 04:00:00 4.61 
2014-01-01 05:00:00 4.58 
2014-01-01 06:00:00 4.47 
2014-01-01 07:00:00 4.66 
2014-01-01 08:00:00 4.46 
2014-01-01 09:00:00 4.57 
2014-01-01 10:00:00 4.87 
2014-01-01 11:00:00 4.57 
2014-01-01 12:00:00 4.67 
2014-01-01 13:00:00 5.52 
2014-01-01 14:00:00 6.42 
2014-01-01 15:00:00 6.79 
2014-01-01 16:00:00 6.50 
2014-01-01 17:00:00 5.81 
2014-01-01 18:00:00 5.65 
2014-01-01 19:00:00 6.25 
2014-01-01 20:00:00 5.79 
2014-01-01 21:00:00 5.84 
2014-01-01 22:00:00 6.06 
2014-01-01 23:00:00 4.74 
2014-01-02 01:00:00 4.66 
2014-01-02 02:00:00 5.59 

Une aide pour résoudre ces deux dernières questions serait plus qu'appréciée!

Répondre

2

Réponse 1: Utilisation% I au lieu de% H

test = strptime(..., "%Y-%b-%d %I:%M:%S %p",tz="GMT") 

Réponse 2:

df$dateSplit <- strsplit(df$ReadingTime, " ") 
df[lengths(df$dateSplit)<3,"ReadingTime"] <- 
    format(
     strptime(df$date[lengths(df$dateSplit)<3], "%Y-%b-%d", tz="GMT"), 
     "%Y-%b-%d %I:%M:%S %p", tz="GMT") 
df$date <- strptime(df$ReadingTime, "%Y-%b-%d %I:%M:%S %p", tz="GMT") 

Réponse 3:

require(xts) 
xts(df$Reading,df$date) 
+0

merci pour la résolution des questions 1. Cependant, les réponses pour Q2 et Q3 ne sont toujours pas entièrement pris en compte. S'il vous plaît voir les modifications dans mon message original. – watINwatOUT

+0

Lengths est supposé être base R (j'utilise la dernière version) - Vous pouvez remplacer 'lengths (df $ dateSplit)' par 'spply (df $ dateSplit, longueur)' – HubertL

+0

problème résolu, merci beaucoup pour l'aide et la patience! Utiliser 'sapply (df $ dateSplit, length)' au lieu de 'lengths (df $ dateSplit)' a résolu le problème! – watINwatOUT