根据日期和另一个数据框的值创建数据框

时间:2020-05-21 21:51:07

标签: python pandas

我有以下问题:

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

如果你们能指出我的方向,那我就不知道如何开始或如何紧凑地写作。

1 个答案:

答案 0 :(得分:1)

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

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