Использование заголовков .csv (строковых дат) в качестве переменных - PullRequest
0 голосов
/ 26 марта 2019

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

«Ошибка типа: индексы списка должны быть целыми или кусочками, а не кортежем».

Я пытался преобразовать результаты даты и времени в int, но получаю:

"Ошибка атрибута: объект list не имеет атрибута astype"

В других частях моего проекта я просто проиндексировал даты (даты в столбце [0]) и проверил местоположение, чтобы извлечь нужные данные из других столбцов, но здесь это не сработает. Мне все еще нужно найти дельту (дни) и преобразовать число дней в (int), чтобы я мог использовать его для повторения следующего шага.

Вот код для импорта и извлечения заголовков:

basketfile = "C:\\....\\Test_Baskets.csv"
rebaldates = pd.read_csv(basketfile, nrows=0)
newdates = [datetime.strptime(x, '%m/%d/%Y') for x in rebaldates]

это дает мне:

In [141]: newdates
Out[141]: 
[datetime.datetime(2010, 12, 31, 0, 0),
 datetime.datetime(2007, 12, 31, 0, 0),
 datetime.datetime(2008, 6, 20, 0, 0),
 datetime.datetime(2008, 12, 19, 0, 0),
 datetime.datetime(2009, 6, 19, 0, 0),
 datetime.datetime(2009, 12, 18, 0, 0),
 datetime.datetime(2010, 6, 18, 0, 0),
 datetime.datetime(2010, 12, 17, 0, 0)]

Я хочу иметь возможность использовать каждый элемент для вычисления дельты, но я получаю эту ошибку, когда пытаюсь выбрать определенный элемент:

newdates[:, :8]
Traceback (most recent call last):
   File "<ipython-input-142-34368864ad97>", line 1, in <module>
    newdates[:, :8]
TypeError: list indices must be integers or slices, not tuple

Я ожидаю, что как только строки даты будут преобразованы в дату и время, я смогу использовать их больше как числа, но, очевидно, есть еще один шаг, который мне нужно предпринять для форматирования элементов или того, как они размещаются. Я просто не уверен, что это ...

1 Ответ

1 голос
/ 26 марта 2019

Вы используете просто списки:

newdates = [datetime.strptime(x, '%m/%d/%Y') for x in rebaldates]
print(newdates)

Выход:

[datetime.datetime(2010, 12, 31, 0, 0),
 datetime.datetime(2007, 12, 31, 0, 0),
 datetime.datetime(2008, 6, 20, 0, 0),
 datetime.datetime(2008, 12, 19, 0, 0),
 datetime.datetime(2009, 6, 19, 0, 0),
 datetime.datetime(2009, 12, 18, 0, 0),
 datetime.datetime(2010, 6, 18, 0, 0),
 datetime.datetime(2010, 12, 17, 0, 0)]

Это

newdates[:, :8]

- это разделение по типу NumPy - оно не поддерживается в обычных списках - вы можете разделять только на целые числа: my_list[inclusive_start:exclusive_stop:steps] (все целые числа)

Для вычисления (попарной) дельты вы можете сделать:

import datetime

newdates=[datetime.datetime(2010, 12, 31, 0, 0),
     datetime.datetime(2007, 12, 31, 0, 0),
     datetime.datetime(2008, 6, 20, 0, 0),
     datetime.datetime(2008, 12, 19, 0, 0),
     datetime.datetime(2009, 6, 19, 0, 0),
     datetime.datetime(2009, 12, 18, 0, 0),
     datetime.datetime(2010, 6, 18, 0, 0),
     datetime.datetime(2010, 12, 17, 0, 0)]

zipper = zip(newdates,newdates[1:])

delta = [(a-b) for a,b in zipper]

print(delta)
print( [d.days for d in delta] )

Выход:

[datetime.timedelta(1096), datetime.timedelta(-172), datetime.timedelta(-182),
 datetime.timedelta(-182), datetime.timedelta(-182), datetime.timedelta(-182), 
 datetime.timedelta(-182)]
[1096, -172, -182, -182, -182, -182, -182]

См .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...