Forum >> Programmazione Python >> Files e Directory >> Leggi CSV scrivi ICS

Pagina: 1

Buongiorno,

ho la necessità di importare in un calendario di outlook, appuntamenti scritti all'interno di un file excels.

Ho deciso di soddisfare questa esigenza utilizzando Python.

Sono riuscito a creare il file .ics partendo da un file .csv (convertito da un excel).

Il problema è che quando importo il .ics, in outlook viene fatto un +2 sulle ore (immagino venga preso come default GMT Time) e non so come dirgli che il fuso orario è Central Europe (Italia) in modo da avere lo stesso orario prelevato dall'xls.

Allego il file CSV e il codice sorgente.

Grazie per l'aiuto.


PS:

Uso Python 3.8 64 Bit SO Windows 10.



Allegati
A questo punto non ti conviene sottrarre 2 a tutte le ore fin dal principio? Sarà un po' rozzo, ma almeno finisci il lavoro.
Ci ho pensato anche io, ma la situazione si complica un pò perchè devo aggiungere anche il codice per gestire il passaggio all'ora legale (è solo una if in più però se ci sono variazione mi sballa poi gli appuntamenti). Infatti prima dell'entrata in vigore dell'ora legale su outlook mi viene sottratta solo un ora.
Diciamo che me la tengo come soluzione estrema, sarebbe più affidabile trovare una soluzione più "robusta".
Uhm... sì beh, quella era la risposta breve... La risposta completa sarebbe:


per prima cosa, tu hai in partenza (sul tuo foglio excel) delle date "naive", ovvero senza l'indicazione di un offset UTC. Non so neanche se Excel supporta l'indicazione dell'offset UTC nelle date. In ogni caso sono quasi certo che le tue date non ce l'hanno. Se una data è "naive", vuol dire che ogni sistema che la legge è libero di interpretarla come crede. Questo è... sgradevole.


All'altro capo della catena, iCalendar supporta benissimo (e ci mancherebbe) le date con gli offset UTC. Vedo però che il tuo script non si preoccupa di specificare un offset UTC, e questo in linea di principio è *sbagliato*. Se tu avessi nel tuo iCalendar le date con gli offset UTC specificati in maniera corretta, vedi che poi Outlook li importa nel modo corretto.


Domanda: ma non potrebbe Outlook importare anche le date "naive" e fare comunque la cosa giusta, ovvero dare per scontato che si riferiscano alla timezone di Roma, e quindi immaginare da solo che abbiano offset UTC+1 (in inverno) e UTC+2 (d'estate)? Ehm... non ne ho la più pallida idea. Forse c'è un modo di chiedere ad Outlook di essere "sensibile al locale" quando importa da iCalendar, ma non ci giurerei. Dovresti controllare bene.


In mezzo tra Excel e iCalendar, c'è il tuo script. Hai due alternative, direi.


Prima alternativa: quella giusta buona e corretta. Il tuo script dovrebbe leggere le date "naive" di Excel, "sapere" (perché lo sai tu!) che si riferiscono alla timezone di Roma, e aggiungere quindi l'offset UTC corretto nelle date prima di esportarle in iCalendar. Ora, il pacchetto che usi per scrivere iCalendar, naturalmente, supporta la scrittura di date con offset UTC. Questo non è un problema. Il problema è invece sapere quando esattamente la timezone di Roma comporta un offset UTC+1 e quando comporta un offset UTC+2. Se le tue date coprono un periodo di molti anni e non hai voglia di fare le cose a mano, puoi senz'altro rivolgerti a uno dei tanti pacchetti Python che "sanno" queste cose... python-dateutil sarebbe l'ideale credo. Altrimenti, se si tratta di uno o due anni, puoi discriminare "a mano" con degli if, e aggiungere l'offset corretto.


Seconda alternativa: quella formalmente sbagliata, ovvero fregarsene allegramente. Continua a scrivere in iCalendar delle date "naive" come stai facendo adesso, solo che devi aggiungere fisicamente una o due ore a seconda dei casi. Ripeto: aggiungere fisicamente le ore, non specificare l'offset UTC. Siccome sai già che alla fine della catena Outlook importa le date "naive" in un certo modo (e non chiediamoci perché), puoi tener conto di questo fatto e presentargli le date "naive" manipolate come piace a lui. Di nuovo, puoi chiedere a un pacchetto specializzato qual è l'offset corretto da calcolare caso per caso, oppure fare a mano con degli if.




Innanzitutto grazie per la risposta articolata.

Su outlook si può impostare il fuso orario a livello di applicazione, ho verificato ed è correttamente impostato su CET.

Su excel non posso fare molto, se proprio devo manipolare le date preferisco farlo nel codice python così diventa trasparente a chi compilerà il foglio excel (magari anche con qualche modulo aggiuntivo o con semplici if).




La prima alternativa è quella che mi piacerebbe perseguire, il problema è che non so come scrivere il codice per realizzarla.

Sul web, googlando in giro, ho visto istruzioni del tipo: "event.add('dtstart', datetime.combine(d,t).replace(tzinfo=lt))" che mi fanno pensare che, con qualche aggiustatina, al mio codice gli si potrebbe dire di creare la stringa per il file ISO convertendola da GMT (com'è il default) a CET senza fuso orario.

Allego il file calendar.ics creato con il mio codice, tra la data di start e di end (DTSTART-DTEND) c'è un T1 che dovrebbe essere cambiato in qualcosa che rappresenti la data CET (la nostra time zone). Il problema è che non so con quale istruzione...









Allegati
Mah, sì... il tuo obiettivo è quello di produrre nel file ics delle stringhe temporali come quelle.


COME ci arrivi, a quell'obbiettivo, è un po' affar tuo. Ho la sensazione che il pacchetto che usi abbia un baco grosso come una casa proprio in questo settore però:
https://icspy.readthedocs.io/en/stable/misc.html#datetimes-are-converted-to-utc-at-parsing-time
https://github.com/C4ptainCrunch/ics.py/issues/188
Non ho tempo di controllare bene, ma ho paura che questo significa che non puoi usare quel pacchetto per produrre qualcosa che non sia UTC nel file ics. Potresti vedere se non c'è qualcosa di meglio. Oppure forse potresti ugualmente tenerti quel pacchetto e convertire prima tutte le date in UTC... e anche qui, *come* scegli di farlo è affar tuo.


Gli strumenti da conoscere sono prima di tutto datetime.tzinfo nella libreria standard. Dopo di che, un punto di partenza è python-dateutils.



Pagina: 1



Esegui il login per scrivere una risposta.