2012-01-08 14 views
5

Come si converte un Python datetime in un Matlab datetnum?Python datetime su Matlab datum

+1

In realtà si intende convertire un oggetto in una lingua in un oggetto in un altro? In tal caso, quale interfaccia stai usando (PyMat?) O intendi come stampi un oggetto datetime in un particolare formato? –

+0

@DavidRobinson - no, intendo la rappresentazione testuale di 'datenum' che Matlab sa leggere. cose come '732399.65465' dove a sinistra è il giorno gregoriano dal 1/1/1 (o 1/1/0 ?!) e sulla destra è la frazione di un giorno – Jonathan

risposta

6

per serializzare datetime come una stringa, strftime può essere utilizzato sul lato Python:

import datetime 
d = datetime.datetime.now() 
print (d.strftime("%d-%b-%Y %H:%M:%S")) 

Secondo MatLab docs datenum sa come analizzarlo.

4

retromarcia cosa è stato fatto here, ho ottenuto:

def datetime2matlabdn(dt): 
    ord = dt.toordinal() 
    mdn = dt + timedelta(days = 366) 
    frac = (dt-datetime(dt.year,dt.month,dt.day,0,0,0)).seconds/(24.0 * 60.0 * 60.0) 
    return mdn.toordinal() + frac 

dovrebbe funzionare con timedelta.microseconds troppo.

In IDLE:

n = datetime.now()

datetime.datetime (2012, 2, 13, 6, 56, 2, 619000)

datetime2matlabdn (n)

734912.28891203704

in Matlab:

>> datestr (734912,28891203704)

ans = 13-Feb-2012 06:56:02

+0

+1 leggermente fuori tema, ma io avevo fare una conversione simile tra MATLAB 'datenum' e C#' System.DateTime' in una mia vecchia risposta. Oltre alle diverse unità utilizzate internamente, il punto di riferimento nel tempo era anche spento di 366 giorni: http://stackoverflow.com/a/7558811/97160 – Amro

+1

in realtà 'datestr (734912.28891203704, 'mmmm dd, yyyy HH: MM: SS. FFF AM ') 'yields' 13 febbraio 2012 6: 56: 02.000 AM' quindi non conserva le informazioni \ microsecondi millisecondi – Jonathan

+0

@jonathan: Grazie. – bavaza

5

Based sulla risposta di bavaza - ora inclusi i microsecondi:

def datetime2matlabdn(dt): 
    mdn = dt + timedelta(days = 366) 
    frac_seconds = (dt-datetime.datetime(dt.year,dt.month,dt.day,0,0,0)).seconds/(24.0 * 60.0 * 60.0) 
    frac_microseconds = dt.microsecond/(24.0 * 60.0 * 60.0 * 1000000.0) 
    return mdn.toordinal() + frac_seconds + frac_microseconds