Найти - Пользователи
Полная версия: arrays with Timestamp is no longer supported
Начало » Python для новичков » arrays with Timestamp is no longer supported
1 2
Meidiland
Всем привет. Задавал подобный вопрос уже на паре форумов, но пока решить проблему не удается, буду благодарен если кто взглянет.

Использовал скрипт с библиотеками 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')


py.user.next
Meidiland
То есть если взять эксель-файл с датами со старого пк, то всё работает. Но стоит даты в файле изменить на новом (или даже просто пересохранить файл ничего не меняя), то выдает эту ошибку.
Замени Excel-файлы на CSV-Файлы. Сделай ввод из CSV-файла и вывод в CSV-файл. После этого можно CSV-файлы преобразовывать в Excel-файлы.
Meidiland
py.user.next
Замени Excel-файлы на CSV-Файлы. Сделай ввод из CSV-файла и вывод в CSV-файл. После этого можно CSV-файлы преобразовывать в Excel-файлы.
Надо тогда существенно изменять скрипт, считывание по столбцам. Неужели обойти эти таймштампы по-другому никак нельзя?
xam1816
Meidiland
Неужели обойти эти таймштампы по-другому никак нельзя
А есть возможность прописать в функкции
 def date_from_int (date_int: int):
    print(date_int)
    print(type(date_int))

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

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


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

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

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

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

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

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

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

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


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

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


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


py.user.next
doza_and
Если других вариантов решить проблему нет, то видимо придется пробовать переделать всё в CSV. Для меня это будет не так просто, потому что язык я знаю плохо и по сути собрал скрипт из примеров в описании библиотеки Investpy, а там везде описывается excel. Для CSV наверное разделители строк надо как-то отдельно прописывать. Плюс моя основная цель не просто парсить котировки, а дальше их обработать с помощью формул в экселе (уже построил там нужные модели), т.е. как минимум придется каждый раз переносить данные в эксель. Огромной проблемы в этом конечно не вижу, просто не верится что никак по-другому нельзя обойти проблему восприятия числа/даты интерпретатором. Эксель я знаю хорошо, питон - плохо, может поэтому я так рассуждаю.
Meidiland
Вообщем нашел пока решение-костыль через правку эксель-файла с датами, которое занимает полминуты времени:
Пишу в любой ячейке цифру 1, копирую её, выделяю диапазон с датами, специальная вставка, умножить. Тогда таймштампы удаляются и остается только дата и интерпретатор начинает её воспринимать.
xam1816
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))
Meidiland
xam1816
Вот костыль,попробуйте так
Что-то ругается на синтаксис строки с таймштампом, не могу понять что не так:
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB