首页 > 解决方案 > 在 pandas 中将时间序列数据一分为二时出错

问题描述

我有来自 Binance 的流式时间序列数据(BTCUSDT 价格),格式DataFrame如下。

导入模块后的初始代码

def btc_pairs_trade(msg):
            
    
        if msg['e'] != 'error':
          price['BTCUSDT'].loc[len(price['BTCUSDT'])] = [pd.Timestamp.now(), 
           float(msg['c'])]
          bn=price['BTCUSDT']
          return bn
        else:
          price['error'] = True

bsm = ThreadedWebsocketManager()
bsm.start()
bsm.start_symbol_ticker_socket(symbol='BTCUSDT', callback=btc_pairs_trade)

## main
while len(price['BTCUSDT']) == 0:
    # wait for WebSocket to start streaming data
    sleep(0.1)
    
sleep(10)
    date                        price   change
0   2021-10-14 07:41:55.963626  57531.56    -100.18
1   2021-10-14 07:41:56.965003  57531.56    -100.18
2   2021-10-14 07:41:56.971939  57531.56    -100.18
3   2021-10-14 07:41:57.964664  57531.57    -100.18
4   2021-10-14 07:41:57.968422  57531.57    -100.18

这个想法是回到由now减去 5 分钟确定的“开始时间”,使用pd.timedelta. 然后创建一个新DataFrame的来保存start_time和 now 之间的数据,即df2. 从那里我继续我的if条件,使用新创建的价格运行任务DataFrame。代码片段如下。

        df = price['BTCUSDT']
        start_time = df.date.iloc[-1] - pd.Timedelta(minutes=5)
        df2 = df.loc[df.date >= start_time]
        if df2.price.iloc[0]-df2.price.iloc[-1]>100:
          try:
        elif df2.price.iloc[0]-df2.price.iloc[-1]<-100:
          try:

问题是当我运行代码时出现以下错误。

---> 11     df2 = df.loc[df.date >= start_time]`
ValueError: cannot reindex from a duplicate axis

我认为错误是因为将第二个 DataFrame 命名为第一个,所以我将第二个更改为 df2。(我使用过 df1),但我仍然遇到同样的问题。有时代码会成功运行,但会出现以下警告。

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

我如何对问题进行排序?

标签: pythonpandasdataframetimedelta

解决方案


推荐阅读