Pandas 向数据框添加其他日期行

Pandas 向数据框添加其他日期行,pandas,dataframe,date,Pandas,Dataframe,Date,我有一个数据框,它保存了许多股票的季度收益日期,如下所示: df = pd.DataFrame( { 'ticker': ['AAPL', 'AAPL', 'AAPL','AAPL', 'MSFT', 'MSFT','MSFT', 'MSFT'], 'datetime': ['2015-01-01', '2015-04-01', '2015-07-01', '2015-12-01', '2015-01-01', '2015-04-01', '2015-07-01', '2015-12-01'

我有一个数据框,它保存了许多股票的季度收益日期,如下所示:

df = pd.DataFrame(  {
'ticker': ['AAPL', 'AAPL', 'AAPL','AAPL', 'MSFT', 'MSFT','MSFT', 'MSFT'], 
'datetime': ['2015-01-01', '2015-04-01', '2015-07-01', '2015-12-01', '2015-01-01', '2015-04-01', '2015-07-01', '2015-12-01'],
})
df['datetime'] = pd.to_datetime(df['datetime'])
我想在每个日期前后再创建n行,使其看起来像这样(对于n=1):


在每一天减去并添加到每个日期,然后
.explode()

t=pd.Timedelta(天=1)
df[“datetime”]=df[“datetime”]。应用(lambda x:[x-t,x,x+t])
df=df.explode(“日期时间”).reset_索引(drop=True)
打印(df)
印刷品:

ticker日期时间
0 AAPL 2014-12-31
1 AAPL 2015-01-01
2 AAPL 2015-01-02
3 AAPL 2015-03-31
4 AAPL 2015-04-01
5 AAPL 2015-04-02
6 AAPL 2015-06-30
7 AAPL 2015-07-01
8 AAPL 2015-07-02
9 AAPL 2015-11-30
10 AAPL 2015-12-01
11 AAPL 2015-12-02
12 MSFT 2014-12-31
13 MSFT 2015-01-01
14 MSFT 2015-01-02
15 MSFT 2015-03-31
16 MSFT 2015-04-01
17 MSFT 2015-04-02
18 MSFT 2015-06-30
19 MSFT 2015-07-01
20 MSFT 2015-07-02
21 MSFT 2015-11-30
22 MSFT 2015-12-01
23 MSFT 2015-12-02

编辑:对于n>1:

n = 2
df["datetime"] = df["datetime"].apply(
    lambda x: [x + pd.Timedelta(days=d) for d in range(-n, n)]
)
df = df.explode("datetime").reset_index(drop=True)
print(df)
印刷品:

ticker日期时间
0 AAPL 2014-12-30
1 AAPL 2014-12-31
2 AAPL 2015-01-01
3 AAPL 2015-01-02
4 AAPL 2015-03-30
5 AAPL 2015-03-31
...

在每个日期中减去并添加一天,然后
.explode()

t=pd.Timedelta(天=1)
df[“datetime”]=df[“datetime”]。应用(lambda x:[x-t,x,x+t])
df=df.explode(“日期时间”).reset_索引(drop=True)
打印(df)
印刷品:

ticker日期时间
0 AAPL 2014-12-31
1 AAPL 2015-01-01
2 AAPL 2015-01-02
3 AAPL 2015-03-31
4 AAPL 2015-04-01
5 AAPL 2015-04-02
6 AAPL 2015-06-30
7 AAPL 2015-07-01
8 AAPL 2015-07-02
9 AAPL 2015-11-30
10 AAPL 2015-12-01
11 AAPL 2015-12-02
12 MSFT 2014-12-31
13 MSFT 2015-01-01
14 MSFT 2015-01-02
15 MSFT 2015-03-31
16 MSFT 2015-04-01
17 MSFT 2015-04-02
18 MSFT 2015-06-30
19 MSFT 2015-07-01
20 MSFT 2015-07-02
21 MSFT 2015-11-30
22 MSFT 2015-12-01
23 MSFT 2015-12-02

编辑:对于n>1:

n = 2
df["datetime"] = df["datetime"].apply(
    lambda x: [x + pd.Timedelta(days=d) for d in range(-n, n)]
)
df = df.explode("datetime").reset_index(drop=True)
print(df)
印刷品:

ticker日期时间
0 AAPL 2014-12-30
1 AAPL 2014-12-31
2 AAPL 2015-01-01
3 AAPL 2015-01-02
4 AAPL 2015-03-30
5 AAPL 2015-03-31
...

您可以使用
日期偏移量
concat
如下:

n = 1 # nb of rows to add
res = (pd.concat([df.assign(datetime = df['datetime'] + pd.DateOffset(days=i)) 
                  for i in range(-n, n+1)])
         .sort_values(['ticker','datetime'])
         .reset_index(drop=True)
)
print(res.head(10))
  ticker   datetime
0   AAPL 2014-12-31
1   AAPL 2015-01-01
2   AAPL 2015-01-02
3   AAPL 2015-03-31
4   AAPL 2015-04-01
5   AAPL 2015-04-02
6   AAPL 2015-06-30
7   AAPL 2015-07-01
8   AAPL 2015-07-02
9   AAPL 2015-11-30

您可以使用
DateOffset
concat
等:

n = 1 # nb of rows to add
res = (pd.concat([df.assign(datetime = df['datetime'] + pd.DateOffset(days=i)) 
                  for i in range(-n, n+1)])
         .sort_values(['ticker','datetime'])
         .reset_index(drop=True)
)
print(res.head(10))
  ticker   datetime
0   AAPL 2014-12-31
1   AAPL 2015-01-01
2   AAPL 2015-01-02
3   AAPL 2015-03-31
4   AAPL 2015-04-01
5   AAPL 2015-04-02
6   AAPL 2015-06-30
7   AAPL 2015-07-01
8   AAPL 2015-07-02
9   AAPL 2015-11-30

哇,我一直对熊猫图书馆的优雅感到惊讶。爆炸是完美的。非常感谢,这太棒了!!!感谢您检查n>1,好东西!!!哇,我一直对熊猫图书馆的优雅感到惊讶。爆炸是完美的。非常感谢,这太棒了!!!感谢您检查n>1,好东西!!!