Package: xautomata-kronos
Python integration with Xautomata APIKronosClasse per la gestione dei timestamp in modo chiaro e univoco. La classe forza l'uso delle timezone indipendentemente da come
si crea l'oggetto temporale.Kronos è basata unicamente su librerie standard di python datetime, math e pytz.Un oggetto Kronos è interamente compatibile con un oggetto datetime.utilizzodatecreazioneil metodoprimetimepermette di creare un elemento temporale KronosimportKronosKronos.primetime(year=2023,month=4)>>2023-04-0100:00:00+02:00primetimeha come campo obligatorio l'anno, i restanti valori vengono messi all'inizio del range temporale non assegnato.
Se non definita, di default viene impostata la timezone di Roma.Kronos.now()eKronos.today()restituiscono l'oggetto Kronos rispettivamente con il momento corrente o il giorno corrente (il giorno è privo di time zone non avendo le ore).conversioneE' possibile passare da datetime a Kronos e viceversa con semplici passaggiimportKronosfromdatetimeimportdatetimenow_k=Kronos.from_datetime(datetime.now())# da datetime a kronosnow_dt1=Kronos.now().dt# da Kronos a datetime estraendo l'attributonow_dt2=Kronos.now().datetime()# da Kronos a datetime con funzione di estrazioneE' altrettanto semplice caricare convertire un isoformat in un oggetto kronosKronos.from_iso('2023-01-01T00:00:00').Un elemento Kronos è poi facilmente convertibile in un formato isoformat in piu di una maniera:importKronosnow_iso1=Kronos.now().iso()# da Kronos a isoformatnow_iso2=Kronos.now().isoformat()# da Kronos a isoformat (identica alla precedente)now_iso3=Kronos.now().dt.isoformat()# da Kronos a datetime a isoformat()In tutte queste situazioni, se la time zone è assente, viene sempre automaticamente aggiunta.Se si carica un elementodatequesto verra convertito in undatetimee abbianto ad una timezone.costruttorinowtodayprimetimefrom_isoformatfrom_isofrom_timestampfrom_tsfrom_datetimefrom_dtfrom_formatfrom_list_iso_to_datetimefrom_list_isofrom_timedeltafrom_tdfunzioniEsistono una serie di operazioni applicabili agli oggetti Kronos:start_ofend_ofadd_durationsubtract_duration==, >, >=, <, <=, -date, datetime, isoformat, iso, timestamp, tsLe operazioni ==, >, >=, <, <=, - permettono di confrontare date cross classi, permettendo di comparare stringhe in isoformat e datetime con Kronos, di seguito un esempio.importKronosfromdatetimeimportdate,datetimeKronos.now()>Kronos.from_iso("2022-01-01")>>>TrueKronos.now()>datetime.fromisoformat("2022-01-01")>>>TrueKronos.now()>date.fromisoformat("2022-01-01")>>>TrueKronos.now()>"2022-01-01">>>Truestart_of, end_ofPermettono di muovere il cursore temporale all'inizio o alla fine di una finestra scelta.
E' possibile sceglire di trasformare una data nell'inizio della giornata o nella fine della settimana, rispetto alla data selezionata.importKronosday=Kronos.now().start_of_day()# ottengo l'inizio della giornatamonth=Kronos.now().end_of_month()# ottengo la fine del meseI range temporale tra cui scegliere sono:minutehourdayweekmonthyearadd and subtract durationPermette di aggiungere o togliere un certo ammontare di range temporale dalla data scelta.importKronosdate=Kronos.from_iso('2023-01-01T00:00:00')# converto un isoformat a Kronosdate.add_duration(days=3,minutes=7)# aggiungo 3 giorni e 7 minuti>>2023-01-0300:07:00+02:00date.subtract_duration(years=1)# tolgo 1 anno>>2022-01-0100:00:00+02:00concatenazioneTutte le operazioni applicabili su un elemento Kronos sono concatenabiliimportKronosdate=Kronos.today().to_datetime().start_of_month().end_of_day()Nell'esempio qui sopra viene presa la gioranta in formato date, viene convertita in datetime, viene preso l'inizio del mese e da li ci si sposta alla fine della giornata.intervallo temporaleesiste un metodo leggermente differente, che dato un Kronos, un intervallo tempora e un offset restituisce gli estremi del range temporale richiesto.importKronosstart,stop=Kronos.from_iso('2023-01-01T00:00:00').from_interval(10,10,'days')>>2022-12-1100:00:00,2022-12-2100:00:00differenze temporaliGli elementi Kronos supportano operazione di somma e sottrazione, ma a differenza di datetime, un operazione matematica tra due elementi kronos produce sempre un elemento kronos.
La ragione di questa scelta è legata al minimizzare gli import per fare operazioni su oggetti temporale.
Chiaramente una volta che un oggetto Kronos ha subito una operazione di questo genere non potra piu supportare i metodi indicati sopra.
Nonostante cio' supporta metodi analoghi a quelli di timedelta e si comportano in modo similare agli altri metodi di Kronos.+/-Le operazioni supportate sono somme e sottrazioniimportKronosnow=Kronos.now()yesterday=now.subtract_duration(days=1)diff=now-yesterday>>1daysSottraendo due elementi Kronos si ottiene un oggetto differenza analogo in tutto e per tutto a un timedeltaconversioneE' possibile passare da timedelta a Kronos e viceversa con semplici passattiimportKronosfromdatetimeimporttimedeltanow_k=Kronos.from_timedelta(td=timedelta(days=1))# da timedelta a kronosnow_td=(Kronos.now()-Kronos.now().subtract_duration(days=1)).td# da Kronos a timedeltaapprossimazionegli oggetti Kronos di differenze temporali possono essere trasformati in numeri interi rappresentati l'approssimazione piu vicina al range temporale chiesto tramite il metodoin_periods.importKronosnow=Kronos.now()yesterday=now.subtract_duration(days=1)diff=now-yesterdaydiff.in_days()>>1