Копипаст
import pandas as pd
from datetime import datetime, timedelta
def get_cbr_data(start_date, end_date):
"""Получение данных с сайта ЦБ для указанного диапазона"""
url = f'http://www.cbr.ru/hd_base/zcyc_params/?UniDbQuery.Posted=True&UniDbQuery.From={start_date}&UniDbQuery.To={end_date}'
try:
tables = pd.read_html(url, decimal=',', thousands=' ')
df = tables[0]
# Обработка заголовков
df.columns = [col[1].replace(',', '.').replace('Дата', 'Date') if isinstance(col, tuple)
else col.replace(',', '.').replace('Дата', 'Date') for col in df.columns]
# Преобразование данных
for col in df.columns[1:]:
df[col] = df[col]. <a name="cut"></a> astype(str).str.replace(',', '.').astype(float) / 100
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
return df
except Exception as e:
print(f"Ошибка при получении данных с {start_date} по {end_date}: {str(e)}")
return pd.DataFrame()
# Разбиваем диапазон на 5-летние интервалы
start_date = "01.01.2010"
end_date = "27.06.2025"
date_ranges = []
current_start = datetime.strptime(start_date, "%d.%m.%Y")
final_end = datetime.strptime(end_date, "%d.%m.%Y")
while current_start < final_end:
current_end = min(current_start + timedelta(days=5*365), final_end)
date_ranges.append((
current_start.strftime("%d.%m.%Y"),
current_end.strftime("%d.%m.%Y")
))
current_start = current_end + timedelta(days=1)
# Собираем данные из всех диапазонов
all_data = []
for start, end in date_ranges:
data = get_cbr_data(start, end)
if not data.empty:
all_data.append(data)
# Объединяем данные, удаляя дубликаты
if all_data:
final_df = pd.concat(all_data).drop_duplicates().sort_values('Date')
final_df.to_csv('yield_curve_full.txt', sep='\t', index=False, float_format='%.4f')
print("Данные успешно сохранены в yield_curve_full.txt")
print(final_df.tail())
else:
print("Не удалось получить данные ни для одного диапазона")