2014-02-02 2 views
0

Я пытаюсь создать MX2 Numpy матрицу или массив из следующих содержимого файла:параметр DTYPE в Numpy genfromtxt

shell: head WORLD#America.csv 
"2013-04-17 12","3","WORLD","#America" 
"2013-04-17 13","9","WORLD","#America" 
"2013-04-17 14","4","WORLD","#America" 
"2013-04-17 15","3","WORLD","#America" 
"2013-04-17 16","7","WORLD","#America" 
"2013-04-17 17","8","WORLD","#America" 
"2013-04-17 18","6","WORLD","#America" 
"2013-04-17 19","6","WORLD","#America" 
"2013-04-17 20","6","WORLD","#America" 
"2013-04-17 21","2","WORLD","#America" 

Я пришел через функцию genfromtxt(), но не увенчались успехом в извлечении своих данных. С файлом под названием f я попробовал следующее: ts = genfromtxt(f, delimiter=",") и получил массив, заполненный всеми nan. Это была только первая попытка, поэтому я прочитал документацию о параметре dtype, который указывает тип данных массива. Похоже, что для получения матрицы MX2 с записями формы (datetime, int) у меня было бы следующее: dtype=[('f1', datetime64), ('f2', uint)]. Когда я сделал это, я получил следующие присваивается переменной ts:

(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L), 
(datetime.datetime(1969, 12, 31, 23, 59, 59, 999999), 18446744073709551615L)], 
dtype=[('f1', ('<M8[us]', {})), ('f2', '<u8')]) 

Каждое значение я для матрицы некоторая константа ... Почему она не читать из моего файла? Очевидно, что это не тот результат, который я должен получить.

Как получить желаемую матрицу MX2 или массив с первым столбцом: datetime, а второй столбец является целым числом, как показано с помощью команды head?

+0

См. Этот ответ: http://stackoverflow.com/questions/2664790/reading-csv-files-in-numpy-where-delimiter-is Я подозреваю, что ваши кавычки вызывают проблемы, и вам нужно будет написать конвертеры вручную. – perimosocordiae

+0

Первый элемент в первом столбце - «2013-04-17 12». В чем смысл «12» в этой области? Это час дня или отдельное поле данных? –

+0

Час дня, правильно! – CodeKingPlusPlus

ответ

0

Как указано в комментариях, одна трудность при чтении этого файла с genfromtxt - наличие символов кавычек. Может быть, это лучше всего (программно) удалить кавычки, но это также возможно, чтобы обмануть вокруг вопроса: Укажите символ кавычки как разделитель:

np.genfromtxt(filename, delimiter='"', dtype=str, comments=None)[0] 
# array(['', '2013-04-17 12', ',', '3', ',', 'WORLD', ',', '#America', ''], 
#  dtype='|S13') 

Теперь файл интерпретируются как имеющие 9 столбцов, где второй и четвертый столбец содержат данные, представляющие интерес.

Другая проблема заключается в том, чтобы указать dtype для столбца даты и времени. В более поздних версиях (?) Numpy вам нужно указать блок времени/даты, или genfromtxt выдает сообщение об ошибке. В этом случае, по-видимому, вам нужно использовать M8[h] как dtype, чтобы указать часовой блок.

В общем, я был в состоянии загрузить файл с:

ts = np.genfromtxt(filename, 
        delimiter='"', 
        dtype='M8[h], uint', 
        usecols=[1,3]) 

В качестве альтернативы, вы можете посмотреть в using a converter или попробовать the CSV reader from Pandas.

Смежные вопросы