pandas - 向熊猫数据框添加额外的日期行
问题描述
我有一个数据框,其中包含一些股票的季度收益日期,如下所示:
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'])
解决方案
减去并添加到每个日期一天,然后.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
...
推荐阅读
- matrix - 在 GLM 中设置矩阵的全局位置
- android - DialogFragment中edittext的光标气泡位置
- devops - systemd 套接字激活不断重生我的服务单元
- webdav - 有没有办法使用休息在贝加尔湖创建用户?
- c# - 无法在发布模式下部署解决方案 - Xamarin Forms
- awk - 使用 AWK 或 SED 替换 IP
- sql-server - 有没有一个简单的查询可以解决这个难题?
- spring-boot - Camel Routes - 如何将正文响应返回为 xml
- stack - 为什么 a^nb^(2n) n ≥ 1 在 PDA 中需要三个状态?
- cordova - localStorage 是否可以安全地用于在 ios cordova 上保存和加载数据?我读到 ios 可能会随机删除 localStorage 数据