Pandas 使用原始日期时间索引从每天重新采样到每月
Pandas resample from daily to monthly using original datetime index
我有每日 OHLC 库存数据。
open high low close
date
1980-01-04 491.8 491.8 491.8 491.8
1980-01-07 492.5 492.5 492.5 492.5
1980-01-08 494.1 494.1 494.1 494.1
1980-01-09 498.0 498.0 498.0 498.0
1980-01-10 497.2 497.2 497.2 497.2
1980-01-11 495.9 495.9 495.9 495.9
1980-01-14 493.0 493.0 493.0 493.0
1980-01-15 492.6 492.6 492.6 492.6
1980-01-16 491.4 491.4 491.4 491.4
1980-01-17 489.6 489.6 489.6 489.6
1980-01-18 484.2 484.2 484.2 484.2
1980-01-21 483.1 483.1 483.1 483.1
1980-01-22 488.7 488.7 488.7 488.7
1980-01-23 490.8 490.8 490.8 490.8
1980-01-24 496.5 496.5 496.5 496.5
1980-01-25 494.3 494.3 494.3 494.3
1980-02-01 509.1 509.1 509.1 509.1
1980-02-04 513.5 513.5 513.5 513.5
1980-02-05 513.4 513.4 513.4 513.4
1980-02-06 509.6 509.6 509.6 509.6
1980-02-07 515.3 515.3 515.3 515.3
1980-02-08 517.8 517.8 517.8 517.8
1980-02-18 520.1 520.1 520.1 520.1
1980-02-19 525.3 525.3 525.3 525.3
1980-02-20 523.8 523.8 523.8 523.8
1980-02-21 528.9 528.9 528.9 528.9
1980-02-22 531.9 531.9 531.9 531.9
1980-02-25 535.2 535.2 535.2 535.2
1980-02-26 528.8 528.8 528.8 528.8
1980-02-29 521.5 521.5 521.5 521.5
1980-03-03 518.7 518.7 518.7 518.7
1980-03-04 513.3 513.3 513.3 513.3
1980-03-05 516.3 516.3 516.3 516.3
我需要按月重新抽样。通常,我会使用以下代码:
output = df_daily.resample('BM').agg({'open': "first", 'high': 'max', 'low': 'min', 'close': "last"})
这将产生以下数据帧。
open high low close
date
1980-01-31 491.8 498.0 483.1 494.3
1980-02-29 509.1 535.2 509.1 521.5
1980-03-31 518.7 518.7 513.3 516.3
但是,我不能使用 BM
相反,我需要使用每日数据框中提供的实际日期时间。也就是说,我正在寻找以下结果:
open high low close
date
1980-01-25 491.8 498.0 483.1 494.3
1980-02-29 509.1 535.2 509.1 521.5
1980-03-05 518.7 518.7 513.3 516.3
将您的索引复制为列,聚合日期以获得最大值(或最后一个,如果已排序)并设置回索引:
df['date'] = df.index
(df.resample('BM')
.agg({'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'date': 'max',
})
.set_index('date')
)
输出:
open high low close
date
1980-01-25 491.8 498.0 483.1 494.3
1980-02-29 509.1 535.2 509.1 521.5
1980-03-05 518.7 518.7 513.3 516.3
我有每日 OHLC 库存数据。
open high low close
date
1980-01-04 491.8 491.8 491.8 491.8
1980-01-07 492.5 492.5 492.5 492.5
1980-01-08 494.1 494.1 494.1 494.1
1980-01-09 498.0 498.0 498.0 498.0
1980-01-10 497.2 497.2 497.2 497.2
1980-01-11 495.9 495.9 495.9 495.9
1980-01-14 493.0 493.0 493.0 493.0
1980-01-15 492.6 492.6 492.6 492.6
1980-01-16 491.4 491.4 491.4 491.4
1980-01-17 489.6 489.6 489.6 489.6
1980-01-18 484.2 484.2 484.2 484.2
1980-01-21 483.1 483.1 483.1 483.1
1980-01-22 488.7 488.7 488.7 488.7
1980-01-23 490.8 490.8 490.8 490.8
1980-01-24 496.5 496.5 496.5 496.5
1980-01-25 494.3 494.3 494.3 494.3
1980-02-01 509.1 509.1 509.1 509.1
1980-02-04 513.5 513.5 513.5 513.5
1980-02-05 513.4 513.4 513.4 513.4
1980-02-06 509.6 509.6 509.6 509.6
1980-02-07 515.3 515.3 515.3 515.3
1980-02-08 517.8 517.8 517.8 517.8
1980-02-18 520.1 520.1 520.1 520.1
1980-02-19 525.3 525.3 525.3 525.3
1980-02-20 523.8 523.8 523.8 523.8
1980-02-21 528.9 528.9 528.9 528.9
1980-02-22 531.9 531.9 531.9 531.9
1980-02-25 535.2 535.2 535.2 535.2
1980-02-26 528.8 528.8 528.8 528.8
1980-02-29 521.5 521.5 521.5 521.5
1980-03-03 518.7 518.7 518.7 518.7
1980-03-04 513.3 513.3 513.3 513.3
1980-03-05 516.3 516.3 516.3 516.3
我需要按月重新抽样。通常,我会使用以下代码:
output = df_daily.resample('BM').agg({'open': "first", 'high': 'max', 'low': 'min', 'close': "last"})
这将产生以下数据帧。
open high low close
date
1980-01-31 491.8 498.0 483.1 494.3
1980-02-29 509.1 535.2 509.1 521.5
1980-03-31 518.7 518.7 513.3 516.3
但是,我不能使用 BM
相反,我需要使用每日数据框中提供的实际日期时间。也就是说,我正在寻找以下结果:
open high low close
date
1980-01-25 491.8 498.0 483.1 494.3
1980-02-29 509.1 535.2 509.1 521.5
1980-03-05 518.7 518.7 513.3 516.3
将您的索引复制为列,聚合日期以获得最大值(或最后一个,如果已排序)并设置回索引:
df['date'] = df.index
(df.resample('BM')
.agg({'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'date': 'max',
})
.set_index('date')
)
输出:
open high low close
date
1980-01-25 491.8 498.0 483.1 494.3
1980-02-29 509.1 535.2 509.1 521.5
1980-03-05 518.7 518.7 513.3 516.3