#python #pandas #dataframe #while-loop #oanda
Вопрос:
Я загружаю данные из API, максимальный период возврата составляет 833 дня, но из моего тестирования я знаю, что у них есть данные, относящиеся к 2002 году. У меня есть функция ниже, которая определяет 833 дня с сегодняшнего дня в два времени даты «конец» и «начало», они вводятся в команду API. Обратите внимание, что они должны быть в строковом формате и отформатированы таким образом, чтобы api мог их принять.
d=datetime.today()
end = str(d.year) "-" str(d.month) "-" str(d.day)
lookbook_period = 833
# Take current date and minus the the max time delta of 833 days to get 'start' var
time_delta = timedelta(days=lookbook_period)
now = datetime.now()
#split the answer and format it to the required timestamp type.
start = str(now - time_delta).split(" ")[0]
Что я хочу сделать, так это загрузить фреймы данных в 833 дневных разделах, а затем собрать их все вместе в CSV или фрейм данных. У меня есть ниже то, что у меня есть до сих пор, но я не уверен, как создать функцию, которая изменяет даты по ходу дела.
def time_machine():
df_total = pd.DataFrame
start_str = str(2002) "-0" str(5) "-0" str(1)
start = datetime(2002,5,1)
print(start)
# amount of days from 2002-05-01 to now
rolling_td = timedelta(days=int(str((datetime.today() - start)).split(" ")[0]))
print(rolling_td, "n")
# API maximum amount of lookbook days
max_td = timedelta(days=833)
# The function would do something similar to this, and on each pass, calling the API and saving the data to a dataframe or CSV.
s1 = start max_td
print(s1)
s2 = s1 max_td
print(s2)
s3 = s2 max_td
print(s3)
d=datetime.today()
end = str(d.year) "-" str(d.month) "-" str(d.day)
print(d)
Любые предложения или инструменты/библиотеки, на которые стоит обратить внимание, будут высоко оценены. Я тестировал вещи с помощью циклов while, но на этот раз я все еще слепо бегу в темноту.
Это примерный код sudo того, что, по моему мнению, мне нужно, но я все еще не уверен, как перейти к следующему разделу
while count > 0 and > 833:
start =
end =
call the API first to download first set of data.
Check date range:
get most recent date 833 days to it
Download next section
repeat
if count < 833:
calulate requied dates for start and end
Ответ №1:
Если вы сначала определите свои диапазоны дат, вы сможете повторять каждый 833-дневный период, чтобы получать данные с помощью API. Затем вам нужно будет добавлять данные во фрейм данных (или csv) для каждой итерации.
import datetime as dt
# Date range to pull data over
start_date = dt.date(2002,5,1)
end_date = dt.date.today()
delta = dt.timedelta(days=832) # 832 so you have a range of 833 days inclusive
# Iterating from start date, recording date ranges of 833 days
date_ranges = []
temp_start_date = start_date
while temp_start_date < end_date:
temp_end_date = temp_start_date delta
if temp_end_date > end_date:
temp_end_date = end_date
date_ranges.append([temp_start_date, temp_end_date])
temp_start_date = temp_end_date dt.timedelta(days=1)
# For each date range, pass dates into API
# Initialise dataframe here
for start_date, end_date in date_ranges:
start_date_str = start_date.strftime("%Y-%m-%d")
end_date_str = end_date.strftime("%Y-%m-%d")
# Input to API with start and end dates in correct string format
# Process data into dataframe
Не должно быть необходимости считать 833 дня, как вы сказали, API принимает даты начала и окончания в качестве аргументов, поэтому вам просто нужно найти их для каждого диапазона дат.
Ответ №2:
Вы можете использовать pandas date_range, чтобы получать свои даты каждые 833 дня и просто повторять. Кроме того, формат вашей даты выглядит как изоформат.
Поместите свой код в цикл for, чтобы получить данные во фрейм данных, а затем выведите их в csv.
dates_list = pd.date_range(start=datetime.now(), periods=10, freq='-833D')
for i in range(1, len(dates_list)):
# print(dates_list[i], dates_list[i-1])
start = dates_list[i].date().isoformat()
end = dates_list[i-1].date().isoformat()
print(start, end)
2019-07-15 2021-10-25
2017-04-03 2019-07-15
2014-12-22 2017-04-03
2012-09-10 2014-12-22
2010-05-31 2012-09-10
2008-02-18 2010-05-31
2005-11-07 2008-02-18
2003-07-28 2005-11-07
2001-04-16 2003-07-28