Вы можете использовать matplotlib.dates.num2date
для преобразования чисел обратно в объекты даты и времени. Затем вызовите isoformat()
, чтобы получить дату в виде строки в формате ISO-8601.
import numpy as np
import matplotlib.dates as md
def num2isodate(num):
result=md.num2date(num).isoformat()
return result
rawtable = np.loadtxt(
'IBTsample.txt', delimiter=',', skiprows=1,
converters= {1:md.datestr2num},
dtype={'names':['Season','ISO_time','Latitude','Longitude','Enum'],
'formats':['uint16','float','f4','f4','uint8']})
Преобразовать тип ISO_time
d в object
. Это позволяет столбцу сначала хранить значения с плавающей запятой, а строки - позже. Обратите внимание, что astype
(ниже) возвращает копию, поэтому явный вызов copy
больше не требуется. Кроме того, поскольку вы вызвали copy
, я предполагаю, что хранение двух копий массива в памяти не является проблемой. (Если бы память была ограничена, мы могли бы написать массив построчно, используя модуль csv вместо np.savetxt
. Но поскольку память не является проблемой, np.savetxt
более удобен.)
sortable = rawtable.astype({'names':['Season','ISO_time','Latitude','Longitude','Enum'],
'formats':['uint16','object','f4','f4','uint8']})
sortable = np.sort(sortable, order=('ISO_time'))
sortable['ISO_time'] = [num2isodate(num) for num in sortable['ISO_time']]
np.savetxt('IBTsorted.txt', sortable, fmt='%d,%s,%.1f,%.1f,%d')
PS. Я бы рекомендовал никогда не использовать from module import *
, особенно когда module
равен numpy
. Он перезаписывает ряд встроенных функций Python, таких как abs
, all
, any
, min
, max
, sum
, round
и т. Д. Мало того, что это затрудняет вызов встроенные Python, но также облегчают написание кода, который выглядит правильно, но содержит трудно обнаруживаемые или тонкие ошибки.