Python "datetime" datatyp...

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Python "datetime" datatyp...

Inlägg av sodjan »

Jag har ett litet Python problem som jag inte får ordning på...

Jag har ett datum i en variabel av typen "tuple"
Om jag gör print på det så ser det ut så här "(2008, 5, 13, 17, 10, 2, 923, 0, 0)"

Jag vill ha det som en variabel av typen "datetime", vilket väl så vitt
jag förstår ska se ungefär likadant ut.

Problemet är att de olika date/time metoderna inte fungerar mot en "tuple",
det måste (så vitt jag förstår) vara ett riktigt datetime objekt...

Jag antar att man skulle kunna använda "replace" och plocka ut varje
fält ur tuple'n för hand, så att säga. D.v.s:

Om A är en datetime och B en tuple så verkar det som om man kan göra :

A = A.replace(year=B[0], month=B[1].....second=B[5])

Det verkar ersätta varje del av A med motsvarande värde från B.
Går det enklare ?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Kommer inte på något på rak arm, men prova #python @ Freenode. Där sitter ofta rena fanatiker som kommer med fina pythonlösningar. :)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK :-)
Hellre en lösning som jag förstår än en fanatikers lösning... :-)
Tillsvidare kör jag med "replace" lösningen till jag kommer på
något annat...
Rhino
Inlägg: 14
Blev medlem: 14 november 2007, 12:48:57
Ort: Bengtsfors

Inlägg av Rhino »

Hejsan, om vi kallar din tuple för

_timetuple = (2008, 5, 13, 17, 10, 2, 923, 0, 0)

så gäller att datetime vill ha de 7 första elementen (år, månad, dag, timme, minut, sekund, mikrosekund).

för enkelhetens skull skapar jag en ny

timetuple = _timetuple[:7]

Python har sedan en operator för att "packa upp" element ur en lista/tuple för att skicka dem som argument : *item

d = datetime.datetime(*timetuple)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Testat...

Problemet är att den "tuple" jag har har 9 element :

(2008, 5, 19, 22, 58, 0, 540, 0, 0)

en datetime vill tydligen ha 8 :

TypeError: function takes at most 8 arguments (9 given)

Aja, jag har en rutin som fungerar där jag använder :

fd = fd.replace(tt[0], tt[1], tt[2], tt[3], tt[4], tt[5])

vilket duger för tillfället...

EDIT !!
Glömde din "[:7]" operation...
Med det med "i bilden" så fungerar det ! :-)
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

Kommer din tuple från time.localtime() (eller motsvarande)? Isåfall kan du slippa krånglet genom att först konvertera den till Unix-tid, och sen låta datetime tugga på den:

Kod: Markera allt

>>> import time
>>> foo = (2008, 5, 13, 17, 10, 2, 923, 0, 0)
>>> foo_unix = time.mktime(foo)
>>> datetime_obj.fromtimestamp(foo_unix)
datetime.datetime(2008, 5, 13, 18, 10, 2)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

"Min" tuple kommer från ZSI (ett SOAP-framework) och jag har
inte en aning om hur den skapas eller så.

Den är i all alla fall ingen "riktig" datatime, utan en ren tuple.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

Det jag mest undrade över är om den tupeln du har är i samma format som den tupel du får av time.localtime(). Om den är det så är det bara skyffla om den till Unix-tid som jag skrev, och sen in i datetime-klassen.

Men det ramverk du använder har bergis funktioner för att hantera sånt utan att blanda in time-modulen.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Tupeln i sig *ser* likadan ut, men den är ändå av fel "typ", så
de olika time/datetime funktionerna fungerar inte direkt.

Rhino's variant fungerar OK, men rellativt lite kod.

Det rutinen gör är för övrigt att "synka" klockan i min
lokala server till "Tradera Official Time"...
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

OK. I annat fall kan du ju alltid casta om den till en tupel först:

>>> import time
>>> type(time.localtime())
<type 'time.struct_time'>
>>> type(tuple(time.localtime()))
<type 'tuple'>
Skriv svar