TypeError с использованием numpy.datetime64 в структурированном массиве - PullRequest
0 голосов
/ 11 декабря 2018

Запуск сценария приводит к исключению: Аргумент TypeError int () должен быть строкой, байтовым объектом или числом, а не datetime.datetime в строке data = np.asarray(tmp, dtype=data_type)

from datetime import datetime
import numpy as np


data_type = [("Scan", "i4"), ("Time", "M8[us]"), ("101 (C)", "f8"), ("Alarm 
             101", "?"), ("102 (C)", "f8"), ("Alarm 102", "?")]
data_text = """1,12/6/2018 09:22:25:462,22.661,0,22.046,0
               2,12/6/2018 09:22:35:446,22.874,0,22.289,0
               3,12/6/2018 09:22:45:446,22.948,0,22.385,0"""


def main():
    tmp = []
    for line in data_text.split("\n"):
        dataLine = []
        for (h, _), v in zip(data_type, line.split(",")):
            if h == "Scan":
                dataLine.append(int(v))
            elif h == "Time":
                # dataLine.append(datetime.strptime(v, "%m/%d/%Y %H:%M:%S:%f"))
                dataLine.append(np.datetime64(datetime.strptime(v, "%m/%d/%Y %H:%M:%S:%f"), "us"))
            elif "Alarm" in h:
                dataLine.append(bool(v))
            else:
                dataLine.append(float(v))
        tmp.append(dataLine)
    data = np.asarray(tmp, dtype=data_type)

if __name__ == "__main__":
    main()

Из пустой документации я не вижу причин, по которым она не должна работать.Лучшее, что я могу понять, это то, что мне чего-то не хватает в numpy структурированных массивах.Это проблема с синтаксисом, ошибка с ошибками или вообще возможная связь с numpy?

Моя настройка:

  • Windows 10
  • Python версии 3.7.0
  • Numpy версия 1.15.4

1 Ответ

0 голосов
/ 12 декабря 2018

Вам просто нужно преобразовать список dataLine в кортеж, и он будет работать просто отлично.Это потому, что ваш array должен сохранить форму (3,).Использование dataLine в качестве списка asarray будет интерпретировать каждое отдельное значение как часть многомерного массива с формой (3,6), а нужный тип d не будет соблюдаться.

def main():
    tmp = []
    for line in data_text.split("\n"):
        dataLine = []
        for (h, _), v in zip(data_type, line.split(",")):
            if h == "Scan":
                dataLine.append(int(v))
            elif h == "Time":
                # dataLine.append(datetime.strptime(v, "%m/%d/%Y %H:%M:%S:%f"))
                dataLine.append(np.datetime64(datetime.strptime(v, "%m/%d/%Y %H:%M:%S:%f"), "us"))
            elif "Alarm" in h:
                dataLine.append(bool(v))
            else:
                dataLine.append(float(v))
        tmp.append(tuple(dataLine))

    data = np.asarray(tmp, dtype=data_type)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...