在股市数据中添加缺失的日期行以保持 pandas 数据框架的连续性

问题描述 投票:0回答:2

所以我有大约 13 年的股市每日低点高点收盘数据。问题是市场有时会在其间休市,因此周一至周五有时可能不会连续出现。看下面

日期 打开 关闭 调整关闭
0 2007年9月17日 星期一 6898 6977.2 6843 6897.1 6897.100098
1 2007年9月18日 星期二 6921.15 7078.95 6883.6 7059.65 7059.649902
2 2007年9月19日 周三 7111 7419.35 7111 7401.85 7401.850098
3 2007年9月20日 星期四 7404.95 7462.9 7343.6 7390.15 7390.149902
4 2007年9月21日 周五 7378.3 7506.35 7367.15 7464.5 7464.5
5 2007年9月25日 星期二 7658.5 7694.25 7490.2 7629.15 7629.149902
7 2007年9月26日 周三 7647.1 7829.85 7591.8 7755.9 7755.899902
8 2007年9月28日 周五 7838.25 8082.85 7836.05 8042.2 8042.200195
9 2007年10月1日 星期一 8008.55 8085.15 7913.3 7987.5 7987.5
10 2007年10月3日 周三 8029.8 8235.8 7820.25 8097.9 8097.899902
11 2007年10月4日 星期四 8083.3 8086.7 7828.65 8035.9 8035.899902
12 2007年5月10日 周五 8038.1 8066.55 7789.7 7845.25 7845.25
13 2007年8月10日 星期一 7853.15 7935.45 7516.45 7626.4 7626.399902
14 2007年9月10日 星期二 7580.9 7916.45 7535.05 7895.85 7895.850098
15 2007年10月10日 周三 7960.65 8081.05 7907.35 8030.65 8030.649902
16 2007年10月11日 星期四 8054.3 8177.75 8005.5 8158.8 8158.799805
17 2007年10月15日 星期一 7962.55 8306.35 7962.55 8286.3 8286.299805
18 2007年10月16日 星期二 8361.4 8491.65 8240.3 8452.2 8452.200195
19 2007年10月17日 周三 8071.55 8218.1 7641.5 8099.9 8099.899902
20 2007年10月18日 星期四 8055.15 8192.45 7519.7 7608.75 7608.75
21 2007年10月19日 周五 7637.4 7718.9 7279.3 7423.8 7423.799805

我希望获得周一到周五具有相同模式的统一数据。因此,只要中间缺少一天,我就想用前一天的值替换它的值。例如,在第 4 号和第 5 号之间,我将添加 24-09-2007 星期一,然后从第 4 号(星期五)复制所有其他值。有时可能会发生连续 2 天丢失的情况,在这种情况下,必须再次复制最后一个值。例如,如果星期一和星期二都缺失,我会添加星期一,复制星期五的数据,然后添加星期二并复制星期一的数据。我如何使用 python pandas 来做到这一点?请记住,有 13 年的数据,因此会有闰年、年份变化等。

python pandas dataframe numpy etl
2个回答
5
投票

流程:

  1. 设置日期索引
  2. 使用“D”对数据帧重新采样
  3. 当天是周六和周日
  4. 用“填充”填充
# Data Index should be timeSeries
df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y')

# upsample
dfn = df.set_index('Date').resample('D').asfreq()

# covert Date to Monday .. Sunday
dfn['Day'] = dfn.index.strftime('%A')

# drop Day in ['Saturday', 'Sunday']
cond = dfn['Day'].isin(['Saturday', 'Sunday'])
dfn = dfn[~cond].fillna(method='ffill').reset_index()

输出:

        Date        Day     Open     High      Low    Close  Adjusted Close
0  2007-09-17     Monday  6898.00  6977.20  6843.00  6897.10     6897.100098
1  2007-09-18    Tuesday  6921.15  7078.95  6883.60  7059.65     7059.649902
2  2007-09-19  Wednesday  7111.00  7419.35  7111.00  7401.85     7401.850098
3  2007-09-20   Thursday  7404.95  7462.90  7343.60  7390.15     7390.149902
4  2007-09-21     Friday  7378.30  7506.35  7367.15  7464.50     7464.500000
5  2007-09-24     Monday  7378.30  7506.35  7367.15  7464.50     7464.500000
6  2007-09-25    Tuesday  7658.50  7694.25  7490.20  7629.15     7629.149902
7  2007-09-26  Wednesday  7647.10  7829.85  7591.80  7755.90     7755.899902
8  2007-09-27   Thursday  7647.10  7829.85  7591.80  7755.90     7755.899902
9  2007-09-28     Friday  7838.25  8082.85  7836.05  8042.20     8042.200195
10 2007-10-01     Monday  8008.55  8085.15  7913.30  7987.50     7987.500000
11 2007-10-02    Tuesday  8008.55  8085.15  7913.30  7987.50     7987.500000
12 2007-10-03  Wednesday  8029.80  8235.80  7820.25  8097.90     8097.899902
13 2007-10-04   Thursday  8083.30  8086.70  7828.65  8035.90     8035.899902
14 2007-10-05     Friday  8038.10  8066.55  7789.70  7845.25     7845.250000
15 2007-10-08     Monday  7853.15  7935.45  7516.45  7626.40     7626.399902
16 2007-10-09    Tuesday  7580.90  7916.45  7535.05  7895.85     7895.850098
17 2007-10-10  Wednesday  7960.65  8081.05  7907.35  8030.65     8030.649902
18 2007-10-11   Thursday  8054.30  8177.75  8005.50  8158.80     8158.799805
19 2007-10-12     Friday  8054.30  8177.75  8005.50  8158.80     8158.799805
20 2007-10-15     Monday  7962.55  8306.35  7962.55  8286.30     8286.299805
21 2007-10-16    Tuesday  8361.40  8491.65  8240.30  8452.20     8452.200195
22 2007-10-17  Wednesday  8071.55  8218.10  7641.50  8099.90     8099.899902
23 2007-10-18   Thursday  8055.15  8192.45  7519.70  7608.75     7608.750000
24 2007-10-19     Friday  7637.40  7718.90  7279.30  7423.80     7423.799805

0
投票

除了周六和周日还有其他假期吗?

我们可以在这里留下一个列表吗?

# drop Day in ['Saturday', 'Sunday']
cond = dfn['Day'].isin(['Saturday', 'Sunday'])
dfn = dfn[~cond].fillna(method='ffill').reset_index()

非常感谢

© www.soinside.com 2019 - 2024. All rights reserved.