Sida 1 av 1
Python "datetime" datatyp...
Postat: 13 maj 2008, 17:28:53
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 ?
Postat: 14 maj 2008, 17:10:52
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.

Postat: 14 maj 2008, 18:32:27
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...
Postat: 19 maj 2008, 21:22:18
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)
Postat: 19 maj 2008, 23:00:36
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 !

Postat: 20 maj 2008, 06:58:40
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)
Postat: 20 maj 2008, 09:08:41
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.
Postat: 20 maj 2008, 21:47:07
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.
Postat: 21 maj 2008, 00:18:35
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"...
Postat: 21 maj 2008, 04:26:41
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'>