Слияние индексов даты и времени с немного разными датами в Python - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь объединить два кадра данных панд с разными индексами даты и времени. DF1 - это квартальная финансовая отчетность для компании XYZ, DF2 - это ежедневная цена закрытия публичных акций XYZ.

Проблема в том, что дата выпуска финансового отчета не всегда совпадает с тем, что присутствует для дневной цены закрытия (предположительно потому, что отчет был выпущен в выходные дни).

Мне нужноспособ размыкания дат из DF2, чтобы при слиянии их с DF1 слияние выбирало самую близкую дату из DF2 вместо того, чтобы оставлять пустое пространство для цены закрытия в слиянии.

В настоящее время используется:

df1 = [['2007-12-30','$xxx,xxx'],
       ['2008-03-30','$xxx,xxx'],
       ['2008-06-28','$xxx,xxx'],
       ['2008-09-29','$xxx,xxx'],
       ['2008-12-31','$xxx,xxx']]

df2 = [['2007-12-30','$45'],
       ['2008-03-30','$40'],
       ['2008-06-27','$38'],
       ['2008-09-29','$46'],
       ['2008-12-30','$50']]

df3 = pd.merge(df1, df2, how='outer', on='date') 

ВОЗВРАТ:

df3 = [['2007-12-30','$xxx,xxx', '$45'],
       ['2008-03-30','$xxx,xxx', '$40'],
       ['2008-06-28','$xxx,xxx', 'NaN'],
       ['2008-09-29','$xxx,xxx', '$46'],
       ['2008-12-31','$xxx,xxx', 'Nan']]

ХОТИТЕ ВЕРНУТЬ:

df3 = [['2007-12-30','$xxx,xxx', '$45'],
       ['2008-03-30','$xxx,xxx', '$40'],
       ['2008-06-28','$xxx,xxx', '$38'],
       ['2008-09-29','$xxx,xxx', '$46'],
       ['2008-12-31','$xxx,xxx', '$50']]

Решение:

df3 = pd.merge(df1, df2, how='outer', on='date')\ 
        .sort_index(ascending=False).fillna(method="ffill")

df3 = df3[df3.index.isin(df1.index)]

Ответы [ 2 ]

0 голосов
/ 12 октября 2019
import pandas as pd

mylist1 = [['2007-12-30','$xxx,xxx'],
       ['2008-03-30','$xxx,xxx'],
       ['2008-06-28','$xxx,xxx'],
       ['2008-09-29','$xxx,xxx'],
       ['2008-12-31','$xxx,xxx']]


mylist2 = [['2007-12-30','$45'],
       ['2008-03-30','$40'],
       ['2008-06-27','$38'],
       ['2008-09-29','$46'],
       ['2008-12-30','$50']]

df1 = pd.DataFrame.from_records(mylist1,columns=['date', "value"])
df2 = pd.DataFrame.from_records(mylist2,columns=['date', "value"])
df3 = pd.merge(df1, df2, right_index=True, left_index=True) 
0 голосов
/ 12 октября 2019

Используйте fillna(method="ffill"), чтобы получить предыдущее значение, а затем сохранить только те строки, дата которых присутствует в df1

df3 = pd.merge(df1, df2, how='outer', on='date').sort_values('date').fillna(method="ffill")
df3 = df3[df3['date'].isin(df1['date'])]
         date    xprice price
0  2007-12-30  $xxx,xxx   $45
1  2008-03-30  $xxx,xxx   $40
2  2008-06-28  $xxx,xxx   $38
3  2008-09-29  $xxx,xxx   $46
4  2008-12-31  $xxx,xxx   $50
...