Заполните следующее поле в таблице предыдущими данными, если предыдущее поле пустое

У меня есть CSV, напрямую связывающийся с серией точек и линий в приложении, которое я разрабатываю из QGIS 2.8. Однако CSV немного проблематичен. Аппаратное обеспечение, предоставляющее данные CSV, предоставляет данные о местоположении только через несколько строк. То есть существует таблица атрибутов с обозначенными столбцами X и Y, поля которой заполняются только в ключевые моменты времени. Остальные - все еще полезные данные, но местоположение обновляется только периодически.

Моя точечная функция структурирована таким образом, что для отображения одной точки используется только самая нижняя (самая последняя) строка атрибута. Естественно, мне нужны данные о местоположении для этой самой нижней строки, иначе точка исчезнет. В настоящее время я не получаю это, но время от времени. Мой CSV -> код точки сейчас выглядит так (pyshp используемая библиотека):

        cur_dir = os.path.dirname(os.path.realpath(__file__))

        file_location = os.path.join(cur_dir, "data", "mycsv.csv")
        out_file = os.path.join(cur_dir, "data", "mypoint.shp")
        idd, az, y, x = [], [], [], []

        with open(file_location, 'rb') as csvfile:
            r = list(csv.reader(csvfile, delimiter=','))
            reader = r[len(r) - 1:] #read only top row
            for i, row in reversed(list(enumerate(reader))): #reverse table
                idd.append(str(row[0]))
                az.append(float(row[2]))
                y.append(float(row[6]))
                x.append(float(row[7]))
                print "appended"


        w = shapefile.Writer(shapefile.POINT)
        w.field('ID', 'N')
        w.field('AZIMUTH', 'N', 12)
        w.field('Y', 'F', 10, 8)
        w.field('X', 'F', 10, 8)

        for j, k in enumerate(x): #write shapefile
            w.point(k, y[j])
            w.record(idd[j],az[j],y[j], k )
            print "recorded"

        w.save(out_file)

Вот фрагмент CSV. Вы увидите расколотые столбцы справа:

Я начал с попытки добавить if x > 0: условия в разных местах ниже нескольких перечислителей, чтобы, возможно, остановить преобразование в цифровую форму, пока данные не будут прочитаны, но мне выдается ошибка min() arg is an empty sequence каждый раз. Я даже не уверен, что это правильное место, чтобы начать, так как это, вероятно, просто расставило бы атрибуты друг с другом. Мне действительно просто нужен какой-то сценарий "если поле X или Y пустое, заполните поле данными предыдущего поля".

Я использую Python 2.7 и PyQt4, разрабатываю API QGIS 2.8 и работаю на Ubuntu 14.04,

1 ответ

Решение

Вы можете кэшировать последние действительные значения точек данных X и Y, которые, как я предполагаю, находятся в строке [6] и строке [7]

    with open(file_location, 'rb') as csvfile:
        r = list(csv.reader(csvfile, delimiter=','))
        reader = r[len(r) - 1:] #read only top row
        lastX = 0.
        lastY = 0.
        for i, row in reversed(list(enumerate(reader))): #reverse table
            idd.append(str(row[0]))
            az.append(float(row[2]))
            try:
                y.append(float(row[6]))
                lastY = float(row[6]))
            except (TypeError, ValueError) as e:
                if len(y) > 0:
                    y.append(lastY)

            try:
                x.append(float(row[7]))
                lastX = float(row[7]))
            except (TypeError, ValueError) as e:
                if len(x) > 0:
                    x.append(lastX)

            print "appended"

Я предполагаю, что пропущенные значения CSV появляются как пустые строки или None. Оба эти значения вызовут исключение при приведении к float(). Если значения идут как 0, то попросите исходный dev сделать значения пустыми, потому что 0 может быть реальной координатой вместо отсутствующей координаты.

Если X и Y всегда проходят одновременно (если у вас есть один, у вас всегда есть другой), то вы можете использовать один блок try / исключением для обработки всех случаев.

Другие вопросы по тегам