Calculer une heure moyenne

Pas si simple, ou je suis idiot

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je cherche actuellement à calculer l'heure moyenne entre deux heures.

Par exemple l'heure moyenne entre 15 et 17 heure est… 16 heures :o .

Sa paraît simple mais si je prends 23h et 1h, l'heure moyenne sera t'elle 12h ou 24h ? En réalité cela dépend du jours: si je prends lundi 4 avril à 23h et mardi 5 à 1h la moyenne devrait être de 24h, cependant si je prends 1h et 23h de la même date la moyenne et de 12h…

Bon, c'est assez difficile à expliquer j'espère que j'ai été clair ;)

Ma question est, quel petit "algorithme" puis-je réaliser pour calculer une heure moyenne entre deux heures ?

Merci beaucoup.

"C'est nuageux par ici"

+0 -0
Staff

Quand on fait de l'info, on utilise soit :

  • les timestamp
  • les datetime / datespan (timeinterval en python)

En effet l'heure en elle même est définie sur $\mathbf{Z}/\mathbf{24*Z}$ donc il n'y a pas de bonne relation d'ordre à faire.

Par contre si tu prends la date complète, c'est beaucoup plus facile.

à partir de là, l'idée c'est juste de faire "heure(date_max - (date_max - date_min)/2)"

+1 -1

Ce que je ferais, c'est pour commencer on regarde si c'est le même jour, si c'est le cas on peut simplement transformer les heures/min/secondes [DMS] ("Equivalent" à Degrées/minutes/secondes) que l'on transforme en degrées décimale [DD] (Je crois que c'est comme ça qu'on dit) et on fait notre moyenne.

Si ce n'est pas le même jour, on regarde si c'est le jour précédent au suivant. Et on refait notre calcule.

Je ne sais pas si j'ai été clair, au quel cas je compléterai ma réponse.

[Edit]
Ah et j'ai vu la réponse de Artragis, je n'ai pas tout compris, mais ma réponse correspondrait plutôt à la manière si je devais le faire sur papier avec ma simple calculatrice :p

Édité par WinXaito

+0 -0

Par exemple l'heure moyenne entre 15 et 17 heure est… 16 heures :o .

Pourquoi pas 4 (soit 16+12 mod 24) ? C'est pour quoi faire ?

C'est comme "la" bissectrice de deux droites : il y en a deux possibles.

date_max - (date_max - date_min)/2

artragis

C'est pour des histoires de dépassement de capacité ? (date_max + date_min) / 2 ne convient pas ?

+0 -0
Staff

ptt : c'est surtout parce que diviser des dates c'est pas immédiat alors que diviser un intervalle de temps, ça a du sens.

artragis

Mathématiquement parlant, le temps pouvant être vu comme un espace vectoriel de dimension 1 (l'origine dépend de la représentation que l'on choisit, mais toutes les représentations courantes sont isomorphes – et heureusement – à l'ensemble des timestamps), on peut tout à fait multiplier ou diviser une date (un vecteur) par un nombre (scalaire). Ça me choque pas, perso.

Edit : de façon moins pédante, une date, au fond ce n'est rien d'autre que la durée de l'intervalle de temps qui la sépare de l'origine des temps, et un signe.

Édité par nohar

I was a llama before it was cool

+3 -0

Sinon un petit test avant l'addition (qui n'est pas commutative :P), et a supposer que tes 2 heures sont "dans le bon sens", c'est-à-dire que $h_1$ est la première date ("la plus vieille") et $h_2$ la deuxième date ("la plus jeune") :

1
2
3
4
si h1 > h2
   ajouter 24 à h2
fin si
moyenne = (h1+h2)/2

Sinon je rejoins ceux du dessus. Convertir les dates en vecteur via des datetime c'est souvent plus simple. Tu aurais par exemple avec

  • $h_1$ le "13/01/2016 23:00" convertit avec un datetime en $h_1 = 736342.958333333$ ;
  • $h_2$ le "14/01/2016 01:00" convertit avec un datetime en $h_2 = 736343.041666667$

Et $m = (h_1 + h_2) /2 = 736343$ reconvertit en date donne $ m $ est le "14/01/2016 00:00".

PS : j'ai utilisé le format de date de GNU Octave, qui compte en jour depuis le 1$^{er}$ janvier 0000, ça peut changer suivant le logiciel (MS office c'est à partir du 1$^{er}$ janvier 1930 il me semble, POSIX en seconde depuis 1970, etc.)

Édité par Gwend@l

+0 -0

Ah oui, je comprends artragis (même pour l'ajout c'est pas « immédiat »). C'est juste que l'on se sert de l'implémentation avec une origine pour calculer un barycentre, comme le dit nohar. C'est vrai que c'est un peu bizarre d'écrire ça. Si les choses sont bien faites, les dates sont un espace affine et il y a un truc de prévu pour calculer un barycentre.

Edit : Ah oui, en Python on a des « timedelta » (les vecteurs) et des « datetime » (les points). Et on peut ajouter un vecteur à un point et faire la « différence » de deux points. Mais j'ai l'impression que ça ne bénéficie pas de tout ce que l'on peut faire en général avec un espace affine…

À la place de fixer une origine, on peut aussi se dire que l'on a des "p-dates" avec p la somme des coefficients des dates que l'on ajoute. Lorsque le coefficient est 0, on a des durées (vecteurs) et lorsque c'est 1 on obtient encore une date (barycentre). Pour implémenter un espace affine de dimension n, on se place dans un espace vectoriel de dimension n+1 et on dit que c'est l'hyper-plan pour lequel une forme linéaire non nulle (qui donne la « masse ») vaut 1. Du coup, ça a du sens d'ajouter des points : on ne trouve plus des points mais des "2-points". J'avais vu ça sur un document de Sylvain Poirier : géométrie.

Édité par blo yhg

+0 -0

Vous vous prendrez quand même beaucoup moins la tête si vous convertissez vos deux dates en timestamps, que vous faites un calcul purement arithmétique et que vous reconvertissez le timestamp obtenu en date.

En javascript ça serait aussi bête que moyenne = new Date((Date.parse(date1).getTime() + Date.parse(date2).getTime())/2). Je ne connais pas l'équivalent python mais ça ne doit pas en être très éloigné.

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0
Auteur du sujet

Désolé de ma réponse tardive, tout ce que vous m'avez indiqué est très complet et je vous en remercie ;)

C'est en effet plus simple que prévu, comme vous me l'avez dit il suffit de faire la moyenne des timestamp correspondant aux deux heures. Puis de convertir le timestamp moyen en une date "humaine".

En tout cas merci beaucoup.

"C'est nuageux par ici"

+0 -0
Auteur du sujet

l'addition n'est pas commutative

Gwend@l

Je ne sais pas si cette phrase à un sens uniquement dans son contexte mais l'addition est bien commutative : $5+4=4+5$ contrairement à la soustraction.

Édité par the_new_sky

"C'est nuageux par ici"

+0 -0

l'addition n'est pas commutative

Gwend@l

Je ne sais pas si cette phrase à un sens uniquement dans son contexte mais l'addition est bien commutative : $5+4=4+5$ contrairement à la soustraction.

the_new_sky

Oui bien sûr que l'addition est commutative :) Mais pas dans ton cas particulier sans utilisations des timestamp.

Ce que je veux dire c'est que pour toi la moyenne entre $h_1=23$ et $h_2=1$ c'est $m=0$, alors que la moyenne entre $h_1=1$ et $h_2=23$ serait $m=12$. Donc ton $h_1$ et $h_2$ ne sont pas commutatif si tu ne tiens compte que des heures et pas du jours/mois/année. Les timestamps sont bien commutatif eux :). D'où le

(…) a supposer que tes 2 heures sont "dans le bon sens", c'est-à-dire que $h_1$ est la première date ("la plus vieille") et $h_2$ la deuxième date ("la plus jeune").

et le test $h_1>h_2$ qui suit, qui en réalité sert à savoir si $h_1$ et $h_2$ sont dans la même journée ou non.

Édité par Gwend@l

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte