[Python] data herleiden adhv weeknummers

Pagina: 1
Acties:
  • 289 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 118557

Topicstarter
Hallo,

Ik heb dictionaries met een weekdag als key, en de values zijn een list met tuples.

Voor elke tuple in de list moet ik het verschil in tijd bereken. Verder zijn ook de weeknummers van elke dictionary bekend.


weeknummer = 36
dict_1 = {'Tuesday': [('Tuesday', '18:30:00', 'Wednesday', '22:00:00')], 'Friday': [('Friday', '06:00:00', 'Friday', '10:00:00'), ('Friday', '10:30:00', 'Friday', '18:00:00'), ('Friday', '18:30:00', 'Friday', '22:00:00')]}

Dus. [('Tuesday', '18:30:00', 'Wednesday', '22:00:00')] , hiervan moet ik dus het verschil in seconden weten van dinsdag 18:30 en woensdag 22:00 uur weten.

Als ik van elk weeknummer nu de begindatum en einddatum weet kan ik wel met het pakket mxDateTime met de dagen uit de dictionary wel het verschil berekenen.
Weet iemand hoe ik nu de begin en einddatum kan herleiden of heeft iemand een beter idee?

Bvd Arjen

Acties:
  • 0 Henk 'm!

Anoniem: 118860

Eindelijk, een topic over Python :+. On to the good stuff :-

Het weeknummer is hierbij toch helemaal niet relevant? Volgens mij kun je dit redelijk goed met de hand oplossen.

Alleen het feit dat de dagen met strings staan aangegeven is een beetje vervelend voor automatische berekening. Deze zul je eerst moeten herleiden tot een dagnummer waar je mee kunt rekenen (maar dat werkt alleen als je zeker weet dat de dagnamen altijd precies hetzelfde gespeld worden).

Het volgende zou (volgens mij) moeten werken, mits het tweede moment in een tuple altijd na het eerste ligt :-

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DAY_MAP = {'Monday' : 0, 'Tuesday' : 1, ...etc..., 'Sunday' : 6}

HOUR_LEN = 60 * 60
DAY_LEN = HOUR_LEN * 24

def seconds_in_day(timestamp):
    parts = [int(p) for p in timestamp.split(':')]
    return parts[2] + parts[1] * 60 + parts[0] * HOUR_LEN

def tuple_diff(tupl):
    day1 = DAY_MAP[tupl[0]]
    sec1 = seconds_in_day(tupl[1])
    day2 = DAY_MAP[tupl[2]]
    sec2 = seconds_in_day(tupl[3])
    
    d = day1
    diff = 0
    while d != day2:
        d = (d + 1) % len(DAY_MAP)
        diff += DAY_LEN
    return diff + (sec2 - sec1)


Op regels 18-20 pas ik in deze code een linear search toe. Dat is een beetje schraal, natuurlijk, en dat valt nog wel geoptimaliseerd te worden. Zo is de code alleen heel erg makkelijk (ivm week-wraps), en afhankelijk van hoe kritiek deze code is, is dit misschien aanvaardbaar (of niet).

[ Voor 34% gewijzigd door Anoniem: 118860 op 09-08-2004 13:21 ]


Acties:
  • 0 Henk 'm!

Anoniem: 118860

Aïïee... ik moet toch eens beter leren lezen. Ik maak er maar een nieuwe post van, omdat deze helemaal niks met mijn vorige te maken heeft.

Je wilt dus de datum weten aan de hand van een weeknummer plus een dagnummer? (Je bracht me helemaal in de war met je beschrijving van je datastructuur ;)).

Weeknummers zijn een lastig onderwerp, omdat dat verschillende standaarden voor zijn. In Europa is het gebruikelijk dat week 1 van een jaar de eerste week is met meer dan 3 dagen erin. En dan hangt het er nog van af of je week op zondag of op maandag begint.

Aangezien dit dus ook nog van het jaartal afhangt, denk ik niet dat je hier genoeg informatie hebt.

Je zou hier eens naar kunnen Googlen, want er zijn wel algoritmes voor (al zijn ze niet makkelijk te vinden...)

Die mxDateTime die je gebruikt ken ik niet. Of bedoel je soms wxDateTime?

Acties:
  • 0 Henk 'm!

Anoniem: 118557

Topicstarter
OneOfBorg,

Je eerste post was zeker voldoende om me te helpen.

Het ging me om het verschil tussen de twee dagen en uren, ik dacht dat ik daarvoor moest gaan rekenen met de weeknummers. Zal properen m'n volgende post iets duidelijker te zijn.


Ik bedoelde wel mxDateTime. Er zitten hier ook mogelijkheden om weeknummers te achterhalen.

vb.

python:
<code>
from mx import DateTime
from mx.DateTime import now
jaar, weeknr, dagnr=now().iso_week
</code>


http://www.egenix.com/files/python/mxDateTime.html

Acties:
  • 0 Henk 'm!

Anoniem: 118860

Smells goody. Die bibliotheek ziet er behoorlijk uitgebreid uit. :)

Ik denk dat ik het snap: je probeerde aan een absolute datum te komen, zodat je daarna met de ingebouwde functies het verschil daartussen zou kunnen bepalen? Klopt?

Overigens had je daar niet persé de hele datum voor nodig gehad: al neem je de eerste week van 1900 (of welke datum dan ook), het verschil in tijd tussen maandag en woensdag is in elk jaar hetzelfde. Dus had je ook een "fake" datum kunnen pakken.

Maar ik ben blij dat het opgelost is.

Acties:
  • 0 Henk 'm!

Anoniem: 118557

Topicstarter
Ik denk dat ik het snap: je probeerde aan een absolute datum te komen, zodat je daarna met de ingebouwde functies het verschil daartussen zou kunnen bepalen? Klopt?
Klopt helemaal.
Eindelijk, een topic over Python . On to the good stuff :-
Klopt ook helemaal :)

Alsnog bedankt!

[ Voor 4% gewijzigd door Anoniem: 118557 op 09-08-2004 14:44 ]

Pagina: 1