La conversion de Matlab datenum format Python
J'ai juste commencé à se déplacer à partir de Matlab pour Python 2.7 et j'ai un peu du mal à lire mon .mat-fichiers. Fois, l'information est stockée dans Matlab datenum format. Pour ceux qui ne sont pas familier avec elle:
Une série date nombre représente une date du calendrier, comme le nombre de jours qui s'est écoulé depuis une base fixe la date. Dans MATLAB, numéro de série, le numéro 1 est le 1er janvier 0000.
MATLAB utilise également de série temps de représenter les fractions de jours, commençant à minuit; par exemple, 6 h, est égale à 0.75 série jours. Ainsi, la chaîne '31-Oct-2003, 6:00 PM" dans MATLAB est le numéro 731885.75.
(prises à partir de la documentation Matlab)
Je voudrais convertir cette Pythons format de l'heure et j'ai trouvé ce tutoriel. En bref, l'auteur affirme que
Si vous analysez ce à l'aide de python
datetime.fromordinal(731965.04835648148)
le résultat peut paraître raisonnable [...]
(avant toutes les autres conversions), qui ne fonctionne pas pour moi, depuis datetime.fromordinal attend un entier:
>>> datetime.fromordinal(731965.04835648148)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: integer argument expected, got float
Alors que je pourrais simplement autour d'eux vers le bas pour les données journalières, j'ai réellement besoin d'importer finement temps de la série. Quelqu'un aurait-il une solution pour ce problème? Je voudrais éviter de reformater mon .tapis de fichiers puisqu'il y en a beaucoup et mes collègues qui ont besoin de travailler avec eux en tant que bien.
Si ça aide, quelqu'un d'autre a demandé pour l'inverse. Malheureusement, je suis trop nouveau pour Python pour vraiment comprendre ce qui s'y passe.
/edit (2012-11-01): Cela a été corrigé dans le tutoriel posté ci-dessus.
OriginalL'auteur Fred S | 2012-12-20
Vous devez vous connecter pour publier un commentaire.
Vous un lien vers la solution, il a un petit problème. C'est cette:
une plus longue explication peut être trouvée ici
matlab_datenum
à unint
avant de l'introduire dansfromordinal
.vous avez raison. fixe.
Ou plus simple:
python_datetime = datetime.fromordinal(int(matlab_datenum) - 366) + timedelta(days=matlab_datenum%1)
🙂OriginalL'auteur carlosdc
Juste au cas où c'est utile pour les autres, voici un exemple complet de temps de chargement de la série de données à partir d'un Matlab tapis de fichier, la conversion d'un vecteur de Matlab datenums à une liste de datetime objets à l'aide de carlosdc réponse (définie comme une fonction), puis de traçage dans le temps avec les Pandas:
OriginalL'auteur Rich Signell
Voici un moyen de les convertir à l'aide de
numpy.datetime64
, plutôt que dedatetime
.Cela fonctionne pour
serdate
soit un entier ou d'un tableau d'entiers.origin
comme vous):delta = np.timedelta64(1,'us') * 86400e6
t = datenum_array * delta + origin
en option:t = t.astype(dtype = 'datetime64[us]')
Oùdatenum_array
est un float array importée à partir d'un .tapis de fichierOriginalL'auteur Dougal
Juste en appuyant sur et en ajoutant des commentaires précédents. La clé est dans la journée de comptage réalisé par la méthode
toordinal
et constructeurfromordinal
dans la classedatetime
et liés à des sous-classes. Par exemple, à partir de la Python Library Reference pour 2,7, on lit quefromordinal
Cependant, l'année 0 ANNONCE est toujours d'un (leap) an à compter, donc il y a encore de 366 jours qui doivent être pris en compte. (Année bissextile, il a été, à l'instar de 2016, c'est exactement 504 cycles de quatre ans auparavant.)
Ces deux fonctions que j'ai été utilisé à des fins similaires:
Espère que cette aide et heureux de l'être corrigé.
OriginalL'auteur XavierStuvw
À l'aide de pandas, on peut convertir un tableau entier de datenum valeurs tout en respectant les parties fractionnaires:
La valeur 719529 est le datenum valeur de l'époque Unix démarrage (1970-01-01), qui est la valeur par défaut
origin
pourmp.to_datetime()
.J'ai utilisé le code Matlab suivant de cette série:
OriginalL'auteur jonas