Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 6, 2021 15:19:56

Meidiland
Зарегистрирован: 2021-08-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

Всем привет. Задавал подобный вопрос уже на паре форумов, но пока решить проблему не удается, буду благодарен если кто взглянет.

Использовал скрипт с библиотеками pandas и investpy для скачивания с известного финансового сайта исторических котировок в эксель файл. Диапазон дат котировок берется из другого эксель файла (для удобства).

И всё прекрасно работало на одном компьютере, но пришлось его поменять и на новом (как и на других) скрипт перестал воспринимать даты из эксель файла, выдает ошибку: TypeError: Addition/subtraction of integers and integer-arrays with Timestamp is no longer supported..
File “pandas\_libs\tslibs\timestamps.pyx”, line 309, in pandas._libs.tslibs.timestamps._Timestamp.__add__

То есть если взять эксель-файл с датами со старого пк, то всё работает. Но стоит даты в файле изменить на новом (или даже просто пересохранить файл ничего не меняя), то выдает эту ошибку.

Я так понимаю что-то с форматом даты (эксель на новом компе проставляет timestamp в дату?). Можно ли это как-то исправить в коде скрипта?
Вот фрагмент кода с ошибками. Ругается на строку № 3 (in date_from_int), преобразующую число в дату.
В интернетах предлагают решать проблему Timestamp'ов при помощи timedelta, но у меня это не получается. Я “новичок” и весь скрипт составлял по сути из описания библиотеки investpy.

 def date_from_int (date_int: int):
    "returns date in datetime format"
    return  datetime.fromordinal(datetime(1900, 1, 1).toordinal() + date_int - 2).strftime('%d/%m/%Y')
test_df=pd.read_excel('Import.xlsx')
print (test_df)
#Fin = pd.DataFrame({'Close':[0.]},index=datetime.fromordinal(datetime(2010, 8, 5)))
for index, row in test_df.iterrows():
    print (row["Name"])
    Tab1 = investpy.get_etf_historical_data(etf=row["Name"], country=row['Country'], from_date=date_from_int(row["Date0"]), to_date=date_from_int(row["Date1"]))
    #print (date_from_int(row["Date0"]))
    Tab1 = Tab1.rename(columns={'Close': row['Name']+'_'+Tab1['Currency'][0]})
    Tab1 = Tab1.drop(columns=['Open','High','Low','Volume','Currency','Exchange'])
    if index == 0:
        Fin = Tab1 
    else: 
        Fin = pd.merge(Fin,Tab1,left_index=True,right_index=True,how='outer')


Отредактировано Meidiland (Авг. 6, 2021 15:36:36)

Офлайн

#2 Авг. 6, 2021 17:17:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

Meidiland
То есть если взять эксель-файл с датами со старого пк, то всё работает. Но стоит даты в файле изменить на новом (или даже просто пересохранить файл ничего не меняя), то выдает эту ошибку.
Замени Excel-файлы на CSV-Файлы. Сделай ввод из CSV-файла и вывод в CSV-файл. После этого можно CSV-файлы преобразовывать в Excel-файлы.



Офлайн

#3 Авг. 11, 2021 17:35:36

Meidiland
Зарегистрирован: 2021-08-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

py.user.next
Замени Excel-файлы на CSV-Файлы. Сделай ввод из CSV-файла и вывод в CSV-файл. После этого можно CSV-файлы преобразовывать в Excel-файлы.
Надо тогда существенно изменять скрипт, считывание по столбцам. Неужели обойти эти таймштампы по-другому никак нельзя?

Отредактировано Meidiland (Авг. 11, 2021 17:35:57)

Офлайн

#4 Авг. 11, 2021 20:23:42

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1355
Репутация: +  119  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

Meidiland
Неужели обойти эти таймштампы по-другому никак нельзя
А есть возможность прописать в функкции
 def date_from_int (date_int: int):
    print(date_int)
    print(type(date_int))

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

Офлайн

#5 Авг. 11, 2021 23:21:07

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

Meidiland
Надо тогда существенно изменять скрипт, считывание по столбцам.
Вот смотри, какой-то дурачок изначально привязался к Excel'ю, якобы это было удобно и быстро написать. Теперь ты с этим ебёшься самым натуральным образом. Это всё было предсказуемо изначально, потому что никто в здравом уме не станет в Excel напрямую писать или управление программой ставить от него в зависимость. Ну, нравится тебе - ну, вперёд. Сегодня ты её залатаешь, завтра опять всё повторится уже с какой-нибудь другой фигнёй. Может, это был ты сам, написал так по незнанию, я не знаю, но я тебе говорю, как надо сделать. Откуда это всё возникло, вся эта ситуация? Просто в Excel'е что-то поменялось и твой код отвалился сразу же. А в CSV ничего не меняется и не поменяется, поэтому надо CSV делать. CSV, JSON, XML - что угодно, но никак не формат файлов какой-то тупой программы, которую индийцы там пишут какие-то каждый день.

Работаешь с pandas, он умеет читать CSV. Так что подумай над этим.


tags: excel pandas



Отредактировано py.user.next (Авг. 26, 2021 17:29:45)

Офлайн

#6 Авг. 12, 2021 07:55:42

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

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

По моему опыту, хороший эксель - мертвый эксель.
История 1.
Вчера.
- У нас проблема, только что все работало и перестало!
- Экселем пользуетесь?
- да
- Ну все понятно

Из одного листа на другой пользователь копирует дату. одна из дат записана как 1998, После вставки в поле с форматом datetime превращается в чтото там 1905 года. Причем снаружи не видно…

К нам просьба, ну типа эксель почините.

История 2
АЭС, Пуск блока, Все на ушах. Звонок. Вася не может стойки конроля поднять. Работаем на запасном комлекте еще пол часа и блок ляжет (по регламенту работа без резерва ограничена по времени).
Дальше пи пи пи пи….

Стойкам для работы нужна таблица коэффициентов. она заливается с флешки из текстового файла.
метка 1 Умный Вася открыл файл экселе и его “проверил”. Пошел заливать. Стойки файл не едят. goto метка 1. Эксель еще умнее 9.02 превратилось в 9 фев. Показывает при этом 9.02. Хорошо все кончилось. Васю не уволили, только премии весь отдел лишили помоему.

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

Можно жаловаться на квалификацию пользователей, но что имеем. Хороший эксель, это когда экселя нет…




Отредактировано doza_and (Авг. 12, 2021 07:59:56)

Офлайн

#7 Авг. 12, 2021 11:22:18

Meidiland
Зарегистрирован: 2021-08-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

xam1816
А есть возможность прописать в функкции
чтобы наблюдать что приходит в функцию когда нет ошибки и когда есть.Во втором случае данные преобразовать в нужный вид

Когда всё хорошо (эксель файл с заданными для скрипта датами сохранен на старом компе):


Когда пересохраняю эксель файл на новом компе и скрипт перестает работать:


py.user.next
doza_and
Если других вариантов решить проблему нет, то видимо придется пробовать переделать всё в CSV. Для меня это будет не так просто, потому что язык я знаю плохо и по сути собрал скрипт из примеров в описании библиотеки Investpy, а там везде описывается excel. Для CSV наверное разделители строк надо как-то отдельно прописывать. Плюс моя основная цель не просто парсить котировки, а дальше их обработать с помощью формул в экселе (уже построил там нужные модели), т.е. как минимум придется каждый раз переносить данные в эксель. Огромной проблемы в этом конечно не вижу, просто не верится что никак по-другому нельзя обойти проблему восприятия числа/даты интерпретатором. Эксель я знаю хорошо, питон - плохо, может поэтому я так рассуждаю.

Отредактировано Meidiland (Авг. 12, 2021 11:26:31)

Офлайн

#8 Авг. 12, 2021 11:46:27

Meidiland
Зарегистрирован: 2021-08-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

Вообщем нашел пока решение-костыль через правку эксель-файла с датами, которое занимает полминуты времени:
Пишу в любой ячейке цифру 1, копирую её, выделяю диапазон с датами, специальная вставка, умножить. Тогда таймштампы удаляются и остается только дата и интерпретатор начинает её воспринимать.

Офлайн

#9 Авг. 12, 2021 12:58:15

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1355
Репутация: +  119  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

Meidiland
Когда всё хорошо (эксель файл с заданными для скрипта датами сохранен на старом компе):
Вот костыль,попробуйте так
 def date_from_int (date_int: int):
	"returns date in datetime format"
	if type(date_int) is int:
		return  datetime.fromordinal(datetime(1900, 1, 1).toordinal() + date_int - 2).strftime('%d/%m/%Y')
	elif type(date_int) is pd._libs.tslibs.timestamps.Timestamp:
		return date_int.strftime('%d/%m/%Y')
	else:
		print('тип данных не подходит >>> ',type(date_int))

Офлайн

#10 Авг. 12, 2021 13:25:39

Meidiland
Зарегистрирован: 2021-08-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

arrays with Timestamp is no longer supported

xam1816
Вот костыль,попробуйте так
Что-то ругается на синтаксис строки с таймштампом, не могу понять что не так:

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version