2012-01-08 28 views
5

¿Cómo convertir un Python datetime a un Matlab datetnum?Python datetime to Matlab datenum

+1

¿Realmente quiere decir convertir un objeto en un idioma a un objeto en otro? Si es así, ¿qué interfaz está usando (PyMat?) ¿O quiere decir cómo se imprime un objeto datetime en un formato particular? –

+0

@DavidRobinson - no, me refiero a la representación textual de 'datenum' que Matlab sabe leer. cosas como '732399.65465' donde a la izquierda está el día gregoriano desde 1/1/1 (o 1/1/0 ?!) y a la derecha está la fracción de un día – Jonathan

Respuesta

6

para serializar fecha y hora como una cadena, strftime se puede utilizar en el lado de Python:

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

Según MatLab docs datenum sabe cómo analizar la misma.

4

de marcha atrás lo que se hizo here, llegué:

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 

debe trabajar con timedelta.microseconds también.

En IDLE:

n = datetime.now()

datetime.datetime (2012, 2, 13, 6, 56, 2, 619 000)

datetime2matlabdn (n)

734912.28891203704

En Matlab:

>> datestr (734912,28891203704)

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

+0

+1 ligeramente fuera de tema, pero tuve para hacer una conversión similar entre MATLAB 'datenum' y C#' System.DateTime' en una vieja respuesta mía. Además de las diferentes unidades utilizadas internamente, el punto de referencia en el tiempo también estaba desactivado en 366 días: http://stackoverflow.com/a/7558811/97160 – Amro

+1

en realidad 'fechastr (734912.28891203704, 'mmmm dd, aaaa HH: MM: SS. FFF AM ') 'produce' 13 de febrero de 2012 6: 56: 02,000 AM' por lo que no retiene la información de milisegundos \ microsegundos – Jonathan

+0

@jonathan: Gracias. – bavaza

5

Based en la respuesta de Bavaza - ahora incluyendo microsegundos:

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