2015-05-15 2 views
1

Я пытаюсь прочитать в файле, который имеет несколько форматов данных в формате .csv. Я использую Python3.2 и Numpy 1.9. Я использую функцию numpy genfromtxt для чтения в данных. Я надеялся, что смогу преобразовать данные, когда я прочитал, чтобы сохранить их соответствующим образом, а не обрабатывать их позже, для чего я использую функции конвертера в настройках.Python 3.2 - Numpy 1.9 genfromtxt

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

Используется ли эта функция раньше? Есть где-то ошибка в моем коде?

КОД:

converterfunc_time= lambda x : (datetime.strptime(x.decode('UTF-8'),'%m/%d/%Y %I:%M:%S %p')) 
    def converterfunc_lat(x): 
     print(x); print(x.decode('UTF-8')) 
     #return float(x.decode('utf-8').split('N')[1]) 
    def converterfunc_san(x): 
     #print(x) 
     return (x.decode('UTF-8')) 



class input_file_processing(): 
     def __init__(self): 
      self.input_data=(np.genfromtxt('filename',skip_header=1,dtype=None,usecols=(0,1,6,7,8,9,10,13), names="Date,SAN,LatDeg,LatMin,LonDeg,LonMin,Beam,EsNo", 
           converters=0:converterfunc_time,1:converterfunc_san,6:converterfunc_lat}, delimiter=',')) 

** ВХОД **

input, file, 1 
4/2/2015 2:13:44 PM,DSN001000557867,03-01-01,0010155818,0,0,N33,00.546,W118,00.638,3,11,1,104,102,82,6,18,2048,4039587 
4/2/2015 2:13:55 PM,DSN001000861511,03-01-02,0010416164,0,0,N33,00.883,W118,00.208,3,11,1,106,102,88,6,18,2048,2792940 
4/2/2015 2:14:44 PM,DSN001000871692,03-01-04,0010408734,0,0,N33,00.876,W118,00.110,3,11,1,105,102,80,6,18,2048,312623 
4/2/2015 2:14:52 PM,DSN001000864906,03-01-05,0010055143,0,0,N33,08.000,W118,03.000,3,11,1,107,99,83,6,18,2048,3056425 
4/2/2015 2:15:00 PM,DSN001000838651,03-01-06,0010265541,0,0,N33,09.749,W118,00.317,3,11,1,100,110,74,6,14,2048,3737937 
4/2/2015 2:15:08 PM,DSN001000609313,03-01-07,0010152885,0,0,N33,05.854,W118,04.107,3,11,1,94,95,62,6,14,2048,8221318 
4/2/2015 2:15:19 PM,DSS31967278,03-01-08,0010350817,0,0,N33,04.551,W118,02.359,3,11,1,127,105,77,6,21,2048,21157710 
4/2/2015 2:16:08 PM,DSN001000822728,03-01-10,0010051377,0,0,N33,00.899,W118,00.132,3,11,1,116,95,61,6,19,2048,3526254 

ВЫВОД

b'03-01-01' 
03-01-01 
b'N33' 
N33 
b'N33' 
N33 
b'N33' 
N33 
b'N33' 
N33 
b'N33' 

Thanks

+0

Вопросы, подобные этому, получат дополнительную помощь, если тестовый пример может быть скопирован-n-вставлен. У меня это работает, но это требует некоторой угадывающей работы. – hpaulj

ответ

0

Я не совсем уверен, что происходит. Но этот сценарий работает:

import numpy as np 
from datetime import datetime 

txt = b"""input, file, 1 
4/2/2015 2:13:44 PM,DSN001000557867,03-01-01,0010155818,0,0,N33,00.546,W118,00.638,3,11,1,104,102,82,6,18,2048,4039587 
4/2/2015 2:13:55 PM,DSN001000861511,03-01-02,0010416164,0,0,N34,00.883,W118,00.208,3,11,1,106,102,88,6,18,2048,2792940 
4/2/2015 2:14:44 PM,DSN001000871692,03-01-04,0010408734,0,0,N35,00.876,W118,00.110,3,11,1,105,102,80,6,18,2048,312623 
4/2/2015 2:14:52 PM,DSN001000864906,03-01-05,0010055143,0,0,N36,08.000,W118,03.000,3,11,1,107,99,83,6,18,2048,3056425 
4/2/2015 2:15:00 PM,DSN001000838651,03-01-06,0010265541,0,0,N33,09.749,W118,00.317,3,11,1,100,110,74,6,14,2048,3737937 
4/2/2015 2:15:08 PM,DSN001000609313,03-01-07,0010152885,0,0,N33,05.854,W118,04.107,3,11,1,94,95,62,6,14,2048,8221318 
""" 
txt = txt.splitlines() 
#txt = txt[1:] 
txt = txt[:3] 
converterfunc_time = lambda x : (datetime.strptime(x.decode('UTF-8'),'%m/%d/%Y %I:%M:%S %p')) 
def converterfunc_lat(x): 
    print('lat ',x, x.decode('UTF-8')) 
    x1 = x.decode('utf-8').split('N') 
    if len(x1)>1: 
     x1 = float(x1[1]) 
     print('float',x1) 
     return x1 
    else: 
     print('error') 
     return "error" 
def converterfunc_san(x): 
    #print(x) 
    return x.decode('UTF-8') 

data = np.genfromtxt(txt, skip_header=1, 
        dtype=None, 
        usecols=(0,1,6,7,8,9,10,13), 
        names="Date,SAN,LatDeg,LatMin,LonDeg,LonMin,Beam,EsNo", 
        delimiter=',') 
print(data) 
print() 
input_data=np.genfromtxt(txt, 
      skip_header=1, 
      dtype='O,a20,f', 
      usecols=(0,1,6,), #(0,1,6,7,8,9,10,13), 
      names="Date,SAN,LatDeg,LatMin,LonDeg,LonMin,Beam,EsNo", 
      converters={0:converterfunc_time, 
         1:converterfunc_san, 
         6:converterfunc_lat}, 
      delimiter=',') 
print(input_data) 

и производит

1552:~/mypy$ python3 stack30269235.py 
[ (b'4/2/2015 2:13:44 PM', b'DSN001000557867', b'N33', 0.546, b'W118', 0.638, 3, 104) 
(b'4/2/2015 2:13:55 PM', b'DSN001000861511', b'N34', 0.883, b'W118', 0.208, 3, 106)] 

lat b'03-01-01' 03-01-01 
error 
lat b'N33' N33 
float 33.0 
lat b'N34' N34 
float 34.0 
[(datetime.datetime(2015, 4, 2, 14, 13, 44), b'DSN001000557867', 33.0) 
(datetime.datetime(2015, 4, 2, 14, 13, 55), b'DSN001000861511', 34.0)] 

Я должен был заполнить некоторые куски, которые отсутствовали в вашем вопросе.

Я добавил явное dtype, чтобы убедиться, что получаю строки и столбцы с плавающей точкой.

И я модифицировал преобразователь lat, чтобы он не задушил вход '03 -01-01 '. ...


genfromtxt делает какое-то испытание ваших преобразователей:

# Find the value to test: 
    if len(first_line): 
     testing_value = first_values[i] 
    else: 
     testing_value = None 
    converters[i].update(conv, locked=True, 
         testing_value=testing_value, 
         default=filling_values[i], 
         missing_values=missing_values[i],) 
    uc_update.append((i, conv)) 

выглядит, как он принимает первую строку данных:

4/2/2015 2:13:44 PM,DSN001000557867,03-01-01,0010155818,0,0,N33 

разделив его на ограничителе , и используя третью строку, 03-01-01, в качестве тестового значения. то есть вместо 6, он использует индекс 6 в вашем параметре usecols. У него проблемы с соответствием usecols, идентификаторы преобразователей, names и, возможно, dtype.

Цель этого тестового значения заключается в определении dtype для столбца. Это необходимо в случае dtype=None. Я не знаю, как он используется, если вы укажете dtype. Очевидно, он все еще работает.

В тестах, где я не пропускаю столбцы, у него нет проблем с соответствующими преобразователями и тестовыми значениями.

+0

Вы правы в том, что genfromtxt, похоже, имеет проблему, соответствующую параметрам «use_cols» и «конвертер». Опция «имена» совпадает с «use_cols». Он отлично работает для меня, если я не использую опцию конвертера и не обрабатываю данные послесловия. Я не знаю, была ли эта ошибка или неправильное использование. Я думаю, что пока я продолжу этот путь и не буду использовать функции «конвертер». – user4905443

+0

еще одна вещь, которую я заметил, это ... это может быть связано с тем, как функция запускает функции преобразователя. Когда я запускаю вышеуказанный код с входными данными, усеченными до одной строки (чтобы упростить чтение) ... Я получаю это как вывод 'b'03-01-01 ' 03-01-01 b' N33 ' N33 b'N33' N33', который является 3-х сторонним, когда должно было быть всего 2 (если я включаю тестовые прогоны) – user4905443

+0

Проведите тест по крайней мере на 2 линии. Он обрабатывает 1 файл строки по-разному. – hpaulj

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