Bonjour,
j'ai un autre problème avec les dates sous 4D.
Soit sous Excel :Code:
1
2
3
4 if 'Beginning' in l: Beginning = l[11:-13] DateRDV = int (float((Beginning ))/1400) + 2
Beginning =61400640
Date : 28.09.2016 08:00
Merci pour votre aide,
Version imprimable
Bonjour,
j'ai un autre problème avec les dates sous 4D.
Soit sous Excel :Code:
1
2
3
4 if 'Beginning' in l: Beginning = l[11:-13] DateRDV = int (float((Beginning ))/1400) + 2
Beginning =61400640
Date : 28.09.2016 08:00
Merci pour votre aide,
Salut,
Ca serait mieux d'être un peu plus explicite sur le problème rencontré.
De plus, s'il faut calculer le datetime Posix à partir d'une base de temps exotique, il suffit de prendre le temps de comprendre la réponse qui vous a été donnée (pour un cas similaire) et l'adapter.
- W
désolé mais je ne vois pas comment solutionner mon problème, je n'ai pas la connaissance requise.
J'ai cherché des solutions, mais sans succès.
Sur Excel, la formule que j'indique fonctionne, mais por passer un UTC, c'est pour moi du chinois !
C'est un peu pour cette raison que je place un post.
Merci de bien vouloir m'aider sur ce problème car je suis perdu.
Meilleures salutations
Guy Muller
Sur Excel, la date 0 commence le 1 Janvier 1900 ou le premier Janvier 1904. Elle est représentée par un nombre flottant où la partie entière représente le nombre de jours écoulés et la partie décimale, heure, minute, secondes.
Sur POSIX, c'est aussi un nombre flottant mais la partie entière représente le nombre de secondes écoulées depuis le 1er Janvier 1970.
Donc si vous récupérez un nombre flottant depuis EXCEL, il y a un petit boulot de conversion à faire (qui vous a déjà été donné) pour l'exprimer à la sauce Posix (qui est autre chose que UTC).
Maintenant, si vous écrivez que Beginning = 61400640 équivaut à Date : 28.09.2016 08:00. Alors là, désolé mais sous excel, 28.09.2016 08:00 est représenté par 42641,3333333333.
61400640 est une date dans 160 000 ans qu'il ne sait même pas afficher correctement.
note: et vous pouvez le vérifier par vous même en lançant Excel.
Donc, je comprends que vous soyez très embêté avec de telles données mais on ne va pas s'assurer que vous avez bien récupéré un timestamp EXCEL: çà c'est votre boulot et on ne peut le faire à votre place (pour autant qu'on en ait envie car çà n'a aucun rapport avec la programmation Python).
- W
désolé, sous Excel c'est :
Soit sous Excel :
Beginning =61400640 / 1400
43857.60
Date : 28.09.2016 08:00
Mon EXCEL raconte autre chose, mais comme c'est un forum Python, inutile d'ergoter sur le sujet.
Comme on vous a déjà donné une solution dans une réponse précédente, qu'avez vous fait pour l'adapter? Quel est le soucis rencontré? Avec Python, multiplier ou additionner, c'est pas si compliqué.
- W
Bonjour,
Merci pour vos réponses, j’ai cherché à changer les paramètres mais cela ne donne rien de sérieux.
Je tourne en boucle ?!?
Merci d’avance pour votre aide, je désespère.
Je devrais avoir # 28.09.2016 08:00 et j'ai 2041/12/11 15:44:00Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import datetime created_timestamp = 61400640 new_epoch = datetime.datetime(1900, 1, 1, 0, 0, 0) os_epoch = datetime.datetime.utcfromtimestamp(0) epoch_delta = (os_epoch - new_epoch) # fromtimestamp si la référence était en heure locale et dont la zone est identique à la machine exécutant le code dt = datetime.datetime.utcfromtimestamp(epoch_delta.total_seconds() + created_timestamp) # dt == datetime.datetime(2017, 10, 19, 10, 38, 6, 999993) print(dt.strftime("%Y/%m/%d %H:%M:%S"))
Ben, essayez une autre approche.
Déjà je ne comprends pas pourquoi vous ne partez pas d'un datetime EXCEL i.e. date = 43857.60.
Vous savez exprimer en nombre le 01/01/1970 depuis EXCEL soit offset ce nombre là.
Donc le nombre de jours (et de pouièmes) depuis le 01/01/1970 sera date - offset.
Pour obtenir le nombre de secondes, il faut multiplier par 3600*24 i.e. seconds = (date - offset) * 3600*24.
Vous avez alors un nombre flottant que vous pouvez passer à datetime.fromtimestamp (ou fromutctimestamp) pour avoir la date et... lui appliquer .strftime("%Y/%m/%d %H:%M:%S").
note: je viens de m'apercevoir que timedelta(days=...) accepte les nombre flottants. Ce qui simplifie beaucoup les choses puisqu'on peut écrire: datetime(1900, 1, 1) + timedelta(days=43857.60)
- W
Un grand merci pour votre aide, j'ai enfin réussi à traiter cette données.
salutations GM
C'est bien... En tous cas, après avoir relu la documentation, le plus simple serait, sans doute, de procéder ainsi:
- WCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 from datetime import datetime, timedelta _DEFAULT_BASETIME = datetime(1900,1,1) def dt2xl(number, base=_DEFAULT_BASETIME): return base + timedelta(days=number) _SECONDS_PER_DAY = 3600*24 def xl2dt(dt, base=datetime(1900,1,1)): delta = dt - base return delta.days + delta.seconds/_SECONDS_PER_DAY if __name__ == '__main__': dt = datetime(2016, 9, 28, 8, 0) number = xl2dt(dt) print(number) dt2 = dt2xl(number) print(dt2) assert dt == dt2
Bonjour, j'ai choisi cette méthode :
Merci pour vos conseils et votre patiente
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 if 'created_timestamp' in l: created_timestamp = l[19:-21] new_epoch = datetime.datetime(1990, 1, 1, 0, 0, 0) os_epoch = datetime.datetime.utcfromtimestamp(0) epoch_delta = (new_epoch - os_epoch) dt = datetime.datetime.utcfromtimestamp(epoch_delta.total_seconds() + float(created_timestamp)) DateCreat = dt.strftime("%Y-%m-%d %H:%M:%S") if 'Beginning' in l: Beginning = l[11:-13] Date = float(Beginning)/1440 Delta = (Date-25569)*86400 dt = datetime.datetime.fromtimestamp(Delta) DateRDV = dt.strftime("%Y-%m-%d %H:%M:%S")