首页 > 解决方案 > 根据另一个数据框的日期和值创建数据框

问题描述

我有以下问题:

1)df1:一个DataFrame具有以下列:

 date        Unnamed: 1 Unnamed: 2 Unnamed: 3 ........ Unnamed: 102 
2001-12-28   v1          v2          v4                    v102
2002-1-30    v1          v3         v7                     v102
2002-2-24    v2          v4         v5                    v102
.
.
.
.
2020-05-20   v1           v8          v9                    v102

在此DataFrame,我有该日期投资组合中股票的日期和名称(v1,v2,...,v102)。

2)df2:在第二个“DataFrame”中:

date               code          price

2002-04-21         v1            50
2002-04-23         v1            50.2
2002-04-23         v2            10.1
.                  .              .
(955809 rows later).              .
.                  .              .
2020-05-20        v3             14.3

在我的第二个DataFrame中,我有下一个日期每只股票的名称和价格

3)我想创建几个DataFrames 每个 3 个月的时间段,从第一行的日期开始,df1然后向前移动 3 个月,只有df1行中存在的股票与开始日期匹配。

例如 :

df3 : 开始日期 2001-12-28

date               code          price

2001-12-28        v1            50
2001-12-29        v1            50.2
2001-12-29        v2            13.1
.                  .              .
.                  .              .
.                  .              .
2020-03-28        v3             6.5

我不知道如何开始,或者如何以紧凑的方式写作,如果你们能指出我一个很好的方向。

标签: pythonpandas

解决方案


获取第一行数据并获取日期

tickers = df1.iloc[0, 1:].tolist()
# if not datetime
#df1['date'] = pd.to_datetime(df1['date'])
start_date = df.date.iloc[0] 
end_date = start_date + pd.DateOffset(months=3)

过滤掉不需要的数据

df2[(df2.date >= start_date) & (df2.date <= end_date) & (df2.ticker.isin(tickers))]

然后您可以将这两个步骤添加到循环中。

list_df = []
last_date =  df1.iloc[-1,0]
start_date = df1.date.iloc[0] 
while True:
    end_date = start_date + pd.DateOffset(months=3)
    cut_off_date =  min(last_date, end_date)
    tickers = df1[df1.date == start_date].iloc[0, 1:].tolist()
    list_df.append(df2[(df2.date >= start_date) & (df2.date <= cut_off_date) & (df2.ticker.isin(tickers))])

    if end_date > last_date:
        break
    start_date = end_date

推荐阅读