Python 基于另一个数据帧的日期和值创建数据帧

Python 基于另一个数据帧的日期和值创建数据帧,python,pandas,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 v

我对以下问题有一个疑问:

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
在这个
数据框架中
,我有日期和该日期投资组合中股票的名称(v1,v2,…,v102)

2)
df2
:在第二个“数据帧”中:

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

3) 我想创建几个
数据帧
,每个数据帧的周期为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

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

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

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))]
df2[(df2.date>=开始日期)和(df2.date=开始日期)和(df2.date最后日期:
打破
开始日期=结束日期

woww,我正期待着一些关于如何继续的提示,非常感谢!我得到了以下错误:indexer错误:单位置索引器超出范围,因为:tickers=df1[df1.date==start\u date].iloc[0,1:::.tolist()@cost的行似乎没有该日期的数据
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