首页 > 解决方案 > 向熊猫数据框添加额外的日期行

问题描述

我有一个数据框,其中包含一些股票的季度收益日期,如下所示:

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):

df = pd.DataFrame(  {
'ticker': ['AAPL', 'AAPL', 'AAPL','AAPL','AAPL', 'AAPL', 'AAPL','AAPL','AAPL', 'AAPL', 'AAPL','AAPL', 'MSFT', 'MSFT','MSFT', 'MSFT','MSFT', 'MSFT','MSFT', 'MSFT','MSFT', 'MSFT','MSFT', 'MSFT'], 
'datetime': ['2014-12-31','2015-01-01','2015-01-02','2015-03-30','2015-04-01', '2015-04-02', '2015-06-30','2015-07-01','2015-07-02', '2015-11-30','2015-12-01', '2015-12-02',
'2014-12-31','2015-01-01','2015-01-02','2015-03-30','2015-04-01', '2015-04-02', '2015-06-30','2015-07-01','2015-07-02', '2015-11-30','2015-12-01', '2015-12-02'],
})
df['datetime'] = pd.to_datetime(df['datetime'])

标签: pandasdataframedate

解决方案


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

t = pd.Timedelta(days=1)
df["datetime"] = df["datetime"].apply(lambda x: [x - t, x, x + t])
df = df.explode("datetime").reset_index(drop=True)
print(df)

印刷:

   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
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   datetime
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

...

推荐阅读