首页 > 解决方案 > 使用 python 重新采样 olhc 数据帧时出错

问题描述

当尝试将 OHLC 数据帧从 1m 重新采样到每小时时,我收到此错误:

数据框

df.info()

#   Column     Dtype         
---  ------     -----         
 0   Date_Time  datetime64[ns]
 1   Open       float64       
 2   High       float64       
 3   Low        float64       
 4   Close      float64

df.tail()

            Date_Time            Open    High    Low     Close
    1692259 2014-12-30 20:51:00  2321.0  1213.0  1223.0  2334.0
    1692260 2014-12-30 20:52:00  2342.0  2322.0  2332.0  2332.0
    1692261 2014-12-30 20:53:00  3421.0  2322.0  2334.0  2123.0
    1692262 2014-12-30 20:54:00  2312.0  2332.0  2324.0  2321.0
    1692263 2014-12-30 20:55:00  2312.0  1212.0  2343.0  2323.0
...

尝试 1

df_ohlc = df.resample('60T', on='Date_Time').ohlc()

错误

DataError: No numeric types to aggregate

尝试 2

使用 venky__ 推荐到另一个具有类似解决方案的帖子

df_ohlc = df.resample('60T', on='Date_Time').agg({
    'Open':'first',
    'High':'max',
    'Low':'min',
    'Close':'last'
})

包括 NaN 但 df 是干净的。如何避免这种情况?

                       Open    High     Low   Close
Date_Time                                          
2015-12-26 18:00:00     NaN     NaN     NaN     NaN
2015-12-26 19:00:00     NaN     NaN     NaN     NaN
2015-12-26 20:00:00     NaN     NaN     NaN     NaN
2015-12-26 21:00:00     NaN     NaN     NaN     NaN
2015-12-26 22:00:00     NaN     NaN     NaN     NaN

标签: pythonpandasdataframe

解决方案


下一个版本的代码对我有用,由于您提供的行数很少,我只进行了 2 分钟的聚合。

我认为不工作的原因是由于您的数据采用字符串格式,而不是需要日期时间列采用日期时间格式,其余的采用浮点数格式,而不是字符串。我从代码中的字符串正确转换为日期时间。

或者不工作的另一个原因是因为你没有这样做df.set_index('Date_Time'),我也在我的代码中这样做了。

在线尝试!

import io, pandas as pd, numpy as np

df = pd.read_csv(io.StringIO("""
Date_Time,Open,High,Low,Close
2014-12-30 20:51:00,2321.0,1213.0,1223.0,2334.0
2014-12-30 20:52:00,2342.0,2322.0,2332.0,2332.0
2014-12-30 20:53:00,3421.0,2322.0,2334.0,2123.0
2014-12-30 20:54:00,2312.0,2332.0,2324.0,2321.0
2014-12-30 20:55:00,2312.0,1212.0,2343.0,2323.0
"""))

df.Date_Time = pd.to_datetime(df.Date_Time)
df.set_index('Date_Time')

print(df)

df = df.resample('2min', on = 'Date_Time').agg({
    'Open':'first',
    'High':'max',
    'Low':'min',
    'Close':'last',
})

print(df)

输出是:

            Date_Time    Open    High     Low   Close
0 2014-12-30 20:51:00  2321.0  1213.0  1223.0  2334.0
1 2014-12-30 20:52:00  2342.0  2322.0  2332.0  2332.0
2 2014-12-30 20:53:00  3421.0  2322.0  2334.0  2123.0
3 2014-12-30 20:54:00  2312.0  2332.0  2324.0  2321.0
4 2014-12-30 20:55:00  2312.0  1212.0  2343.0  2323.0
                       Open    High     Low   Close
Date_Time
2014-12-30 20:50:00  2321.0  1213.0  1223.0  2334.0
2014-12-30 20:52:00  2342.0  2322.0  2332.0  2123.0
2014-12-30 20:54:00  2312.0  2332.0  2324.0  2323.0

推荐阅读