Я пытался воссоздать ваш CSV-файл с помощью:
In [23]: cat stack59665655.txt
id, datetime, anomaly_length, affected_sensors, reason
1, 2019-12-20 08:09, 26, all, Open Windows
1, 2019-12-20 08:10, 26, all, Open Windows
1, 2019-12-20 08:11, 26, all, Open Windows
С помощью pandas
Я могу прочитать его с помощью:
In [24]: data = pd.read_csv('stack59665655.txt')
In [25]: data
Out[25]:
id datetime anomaly_length affected_sensors reason
0 1 2019-12-20 08:09 26 all Open Windows
1 1 2019-12-20 08:10 26 all Open Windows
2 1 2019-12-20 08:11 26 all Open Windows
In [26]: data.dtypes
Out[26]:
id int64
datetime object
anomaly_length int64
affected_sensors object
reason object
dtype: object
Столбцы object
содержат строки. Я подозреваю, что pandas имеет способ преобразования этого datetime
строкового столбца в datetime
объектов или np.datetime64
.
Простое преобразование в массив создает массив типа dtype:
In [27]: data.to_numpy()
Out[27]:
array([[1, ' 2019-12-20 08:09', 26, ' all', ' Open Windows'],
[1, ' 2019-12-20 08:10', 26, ' all', ' Open Windows'],
[1, ' 2019-12-20 08:11', 26, ' all', ' Open Windows']],
dtype=object)
to_records
создает массив record
, вариант структурированного массива. Обратите внимание на составной dtype:
In [28]: data.to_records()
Out[28]:
rec.array([(0, 1, ' 2019-12-20 08:09', 26, ' all', ' Open Windows'),
(1, 1, ' 2019-12-20 08:10', 26, ' all', ' Open Windows'),
(2, 1, ' 2019-12-20 08:11', 26, ' all', ' Open Windows')],
dtype=[('index', '<i8'), ('id', '<i8'), (' datetime', 'O'), (' anomaly_length', '<i8'), (' affected_sensors', 'O'), (' reason', 'O')])
Вместо этого, используя genfromtxt
с его режимом авто-dtype:
In [29]: data1 =np.genfromtxt('stack59665655.txt',dtype=None, names=True,delimit
...: er=',',encoding=None, autostrip=True)
In [30]: data1
Out[30]:
array([(1, '2019-12-20 08:09', 26, 'all', 'Open Windows'),
(1, '2019-12-20 08:10', 26, 'all', 'Open Windows'),
(1, '2019-12-20 08:11', 26, 'all', 'Open Windows')],
dtype=[('id', '<i8'), ('datetime', '<U16'), ('anomaly_length', '<i8'), ('affected_sensors', '<U3'), ('reason', '<U12')])
Я мог бы преобразовать поле datetime
с помощью:
In [31]: data1['datetime']
Out[31]:
array(['2019-12-20 08:09', '2019-12-20 08:10', '2019-12-20 08:11'],
dtype='<U16')
In [32]: data1['datetime'].astype('datetime64[m]')
Out[32]:
array(['2019-12-20T08:09', '2019-12-20T08:10', '2019-12-20T08:11'],
dtype='datetime64[m]')
Изменение этого места на самом деле требует определения нового dtype.
Или я мог бы создать собственный dtype, например, изменив выведенный для data1
:
In [45]: dt = data1.dtype.descr
In [46]: dt[1]=('datetime', 'datetime64[m]')
In [47]: dt= np.dtype(dt)
In [48]: dt
Out[48]: dtype([('id', '<i8'), ('datetime', '<M8[m]'), ('anomaly_length', '<i8'), ('affected_sensors', '<U3'), ('reason', '<U12')])
In [49]: data2 =np.genfromtxt('stack59665655.txt',dtype=dt, names=True,delimiter
...: =',',encoding=None, autostrip=True)
In [50]: data2
Out[50]:
array([(1, '2019-12-20T08:09', 26, 'all', 'Open Windows'),
(1, '2019-12-20T08:10', 26, 'all', 'Open Windows'),
(1, '2019-12-20T08:11', 26, 'all', 'Open Windows')],
dtype=[('id', '<i8'), ('datetime', '<M8[m]'), ('anomaly_length', '<i8'), ('affected_sensors', '<U3'), ('reason', '<U12')])
Чтобы использовать datetime
объекты, я должен был бы использовать converter
в `genfromtxt.