2017-04-04 1 views
0

Je travaille avec une base de données cx_Oracle avec des enregistrements ayant chacune des colonnes timestamp et value. J'ai besoin d'élaborer des fonctions d'agrégation, ou min, ou somme ou autres (selon un fichier de configuration) pour les enregistrements stockés toutes les heures (24 slots par jour: 00-01, 01-02 ... 23-00). Chaque table commence avec un horodatage différent, il y a peut-être dix ans ou hier, donc je devrais envisager d'agréger les enregistrements à partir de l'heure du premier horodatage. Supposons que le premier horodatage soit 14h: 43m: 20s, cet enregistrement doit être stocké dans la fente 14-15. La question est de savoir quelle est la meilleure façon de calculer l'horodateur correspondant à 14h00 de cet horodatage? Ensuite, j'ai pensé à procéder par une étape d'une heure en utilisant timedelta + 1h arithmétique et faire ce dont j'ai besoin. Quoi qu'il en soit, j'accepte tout conseil si ce n'est pas la meilleure façon de procéder.Python 2.6 - Comment obtenir l'heure à partir de l'horodateur

+1

Ne devriez-vous pas effectuer le regroupement et l'agrégation en SQL plutôt qu'en Python? – Arkadiy

Répondre

0

Votre question est plus sur SQL que sur python. C'est ainsi que j'obtiens la moyenne (ou d'autres agrégats) via SQL.

select avg(EXTRACT(HOUR FROM <timestamp>)) as avg_hrs, 
min(EXTRACT(HOUR FROM <timestamp>)) as min_hrs, 
sum(EXTRACT(HOUR FROM <timestamp>)) as sum_hrs 
from <table>; 

Somme n'a pas de sens, mais je laisse à vous de trouver l'utilité. Voici une autre requête pour les comptes. J'espère que cela t'aides.

select EXTRACT(HOUR FROM <timestamp>) as hrs, count(*) as cnt 
from <table> 
group by EXTRACT(HOUR FROM <timestamp>) 
order by 1; 
+0

Merci, je voudrais travailler par SQL, mais le problème est que la table a une autre colonne 'name' que j'ai besoin de grouper par, puis ordonnée par' timestamp'. Je veux dire '... ORDER BY name, timestamp', et je dois travailler sur tous les enregistrements d'un' nom' spécifique ordonné par 'timestamp', puis les regrouper avec la fonction d'agrégat. Donc, je ne peux pas grouper seulement par horodatage en raison de la possibilité qu'ils appartiennent à différentes valeurs 'name'. J'espère que ce que je dis est clair. – Caramelleamare

+0

J'essaye avec ceci 'select avg (EXTRACT (HEURE FROM 1435047532)) comme hour' mais retourne cette erreur: _invalid extrait le champ pour extraire la source_ Où ai-je tort? – Caramelleamare

+1

1435047532 n'est pas un horodatage mais une valeur d'une donnée avec horodatage de type. Donc, si vous obtenez la valeur HOUR, cela n'aura pas de sens puisque ce n'est pas un type de données de type horodatage. SVP donnez-moi un exemple de données pour votre table avec leurs noms de colonne et ce que vous voulez réaliser (comme le groupe par cette colonne puis avg cette colonne ... etc) – anonyXmous