Экспорт даты ISO в Numpy - PullRequest
       32

Экспорт даты ISO в Numpy

1 голос
/ 02 ноября 2011

Я новичок в Python и у меня есть основной вопрос. Я не могу найти решение в сети.

У меня есть таблица с именем IBTsample.txt, содержащая:

  • Сезон, ISO_time, Широта, Долгота, Enum
  • 2009,2009-12-24 12: 00: 00,6.50,85,00,2
  • 2009,2009-12-25 06:00:00, 8.00,84.50,6
  • 2009,2009-12-25 00: 00: 00,7.00,84.50,4
  • 2009,2009-12-24 18: 00: 00,6.50, 85,00,3
  • 2009,2009-12-24 09: 00: 00,6.50,85,00,1
  • 2009,2009-12-25 03: 00: 00,7.00,84.50, 5

То, что я хотел бы сделать, это импортировать его в виде массива, выполнить некоторую обработку (в настоящее время просто сортировать записи по дате) и экспортировать обработанную таблицу в новый .txtфайл.

from numpy import *
import pylab

rawtable = loadtxt('IBTsample.txt', delimiter=',', skiprows=1, converters=    {1:pylab.datestr2num},\
               dtype={'names':('Season','ISO_time','Latitude','Longitude','Enum'),\
                      'formats':('uint16','float','float16','float16','uint8')})
sortable = (sort(rawtable, order=('ISO_time'))).copy()
savetxt('IBTsorted.txt', sortable, fmt='%d,%.3f,%.1f,%.1f,%d')

Я использую функцию pylab.datestr2num во время импорта, но не могу найти обратную функцию для экспорта даты и времени в формате ISO.

Любая помощь илиИдея была бы полезна.

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Вы можете использовать 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, но также облегчают написание кода, который выглядит правильно, но содержит трудно обнаруживаемые или тонкие ошибки.

1 голос
/ 02 ноября 2011

В дополнение к ответу @ unutbu, если вы используете последнюю версию numpy (>= 1.7), существует собственная дата dtype.

В этом случае попробуйте что-то вроде этого:

import numpy as np
import dateutil.parser

rawtable = np.genfromtxt('test_in.txt', names=True, delimiter=',', 
                converters={1:dateutil.parser.parse},
                dtype=[np.uint16, np.datetime64, np.float, np.float, np.uint8])

sorttable = np.sort(rawtable, order=('ISO_time'))

with open('test_out.txt', 'w') as outfile:
    outfile.write(','.join(sorttable.dtype.names) + '\n')
    np.savetxt(outfile, sorttable, fmt='%i,%r,%f,%f,%i')

Это дает:

Season,ISO_time,Latitude,Longitude,Enum
2009,2009-12-24 09:00:00,6.500000,85.000000,1
2009,2009-12-24 12:00:00,6.500000,85.000000,2
2009,2009-12-24 18:00:00,6.500000,85.000000,3
2009,2009-12-25 00:00:00,7.000000,84.500000,4
2009,2009-12-25 03:00:00,7.000000,84.500000,5
2009,2009-12-25 06:00:00,8.000000,84.500000,6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...