Форум сайта python.su
Всем привет. Задавал подобный вопрос уже на паре форумов, но пока решить проблему не удается, буду благодарен если кто взглянет.
Использовал скрипт с библиотеками 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)
Офлайн
MeidilandЗамени Excel-файлы на CSV-Файлы. Сделай ввод из CSV-файла и вывод в CSV-файл. После этого можно CSV-файлы преобразовывать в Excel-файлы.
То есть если взять эксель-файл с датами со старого пк, то всё работает. Но стоит даты в файле изменить на новом (или даже просто пересохранить файл ничего не меняя), то выдает эту ошибку.
Офлайн
py.user.nextНадо тогда существенно изменять скрипт, считывание по столбцам. Неужели обойти эти таймштампы по-другому никак нельзя?
Замени Excel-файлы на CSV-Файлы. Сделай ввод из CSV-файла и вывод в CSV-файл. После этого можно CSV-файлы преобразовывать в Excel-файлы.
Отредактировано Meidiland (Авг. 11, 2021 17:35:57)
Офлайн
MeidilandА есть возможность прописать в функкции
Неужели обойти эти таймштампы по-другому никак нельзя
def date_from_int (date_int: int): print(date_int) print(type(date_int))
Офлайн
MeidilandВот смотри, какой-то дурачок изначально привязался к Excel'ю, якобы это было удобно и быстро написать. Теперь ты с этим ебёшься самым натуральным образом. Это всё было предсказуемо изначально, потому что никто в здравом уме не станет в Excel напрямую писать или управление программой ставить от него в зависимость. Ну, нравится тебе - ну, вперёд. Сегодня ты её залатаешь, завтра опять всё повторится уже с какой-нибудь другой фигнёй. Может, это был ты сам, написал так по незнанию, я не знаю, но я тебе говорю, как надо сделать. Откуда это всё возникло, вся эта ситуация? Просто в Excel'е что-то поменялось и твой код отвалился сразу же. А в CSV ничего не меняется и не поменяется, поэтому надо CSV делать. CSV, JSON, XML - что угодно, но никак не формат файлов какой-то тупой программы, которую индийцы там пишут какие-то каждый день.
Надо тогда существенно изменять скрипт, считывание по столбцам.
Отредактировано py.user.next (Авг. 26, 2021 17:29:45)
Офлайн
К посту выше. Сага.
Да, в эселе удобно фильтровать строчечки и столбцы, просматривать таблички. Впечатляет, особенно когда не знаешь других табличных процессоров, которых море. И когда молодой и зеленый и все данные пока простые таблички, не встречался с мультиграфами, деревьями, не работал с картинками, звуком, логами реальных систем, результатами томографии, или эхолокации, не пытался разобраться с терабайтом ядерных данных.
По моему опыту, хороший эксель - мертвый эксель.
История 1.
Вчера.
- У нас проблема, только что все работало и перестало!
- Экселем пользуетесь?
- да
- Ну все понятно
Из одного листа на другой пользователь копирует дату. одна из дат записана как 1998, После вставки в поле с форматом datetime превращается в чтото там 1905 года. Причем снаружи не видно…
К нам просьба, ну типа эксель почините.
История 2
АЭС, Пуск блока, Все на ушах. Звонок. Вася не может стойки конроля поднять. Работаем на запасном комлекте еще пол часа и блок ляжет (по регламенту работа без резерва ограничена по времени).
Дальше пи пи пи пи….
Стойкам для работы нужна таблица коэффициентов. она заливается с флешки из текстового файла.
метка 1 Умный Вася открыл файл экселе и его “проверил”. Пошел заливать. Стойки файл не едят. goto метка 1. Эксель еще умнее 9.02 превратилось в 9 фев. Показывает при этом 9.02. Хорошо все кончилось. Васю не уволили, только премии весь отдел лишили помоему.
Я даже не знаю. Помоему от экселя вреда больше чем пользы. Сколько встречал пользователей, каждый день у них то один глюк то другой. Программа просто непредсказуемая… И чем больше версий тем непредсказуемее.
Можно жаловаться на квалификацию пользователей, но что имеем. Хороший эксель, это когда экселя нет…
Отредактировано doza_and (Авг. 12, 2021 07:59:56)
Офлайн
xam1816
А есть возможность прописать в функкции
чтобы наблюдать что приходит в функцию когда нет ошибки и когда есть.Во втором случае данные преобразовать в нужный вид
Отредактировано Meidiland (Авг. 12, 2021 11:26:31)
Офлайн
Вообщем нашел пока решение-костыль через правку эксель-файла с датами, которое занимает полминуты времени:
Пишу в любой ячейке цифру 1, копирую её, выделяю диапазон с датами, специальная вставка, умножить. Тогда таймштампы удаляются и остается только дата и интерпретатор начинает её воспринимать.
Офлайн
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))
Офлайн
xam1816Что-то ругается на синтаксис строки с таймштампом, не могу понять что не так:
Вот костыль,попробуйте так
Офлайн