Pandas 用新数据追加数据帧

Pandas 用新数据追加数据帧,pandas,dataframe,append,Pandas,Dataframe,Append,我试图建立一个股票数据的数据框架,我可以得到我需要的所有数据,但一次只能得到1000个数据点。所以我想做的是将最初的1000个数据点保存在一个csv文件中,然后时不时地运行我的程序,以及任何新数据,我想附加到旧的数据框中。因此,它需要对照“旧df”检查“新df”,并附加任何新行 假设我的“旧df”保存在csv文件中,如下所示: Date Stock A Stock B Stock C Stock D 01/02/19 100.0 87.0 74.0 228.0

我试图建立一个股票数据的数据框架,我可以得到我需要的所有数据,但一次只能得到1000个数据点。所以我想做的是将最初的1000个数据点保存在一个csv文件中,然后时不时地运行我的程序,以及任何新数据,我想附加到旧的数据框中。因此,它需要对照“旧df”检查“新df”,并附加任何新行

假设我的“旧df”保存在csv文件中,如下所示:

Date     Stock A  Stock B  Stock C  Stock D
01/02/19 100.0    87.0     74.0     228.0
02/02/19 101.5    87.5     75.0     227.0
03/02/19 102.0    89.0     76.5     225.5
Date     Stock A  Stock B  Stock C  Stock D
02/02/19 101.5    87.5     75.0     227.0
03/02/19 102.0    89.0     76.5     225.5
04/02/19 103.0    89.5     77.5     226.0
然后第二天我运行我的程序,“新df”如下所示:

Date     Stock A  Stock B  Stock C  Stock D
01/02/19 100.0    87.0     74.0     228.0
02/02/19 101.5    87.5     75.0     227.0
03/02/19 102.0    89.0     76.5     225.5
Date     Stock A  Stock B  Stock C  Stock D
02/02/19 101.5    87.5     75.0     227.0
03/02/19 102.0    89.0     76.5     225.5
04/02/19 103.0    89.5     77.5     226.0
然后,我需要的是我的程序识别“新df”中的最后一行不在“旧df”中,并在“旧df”中附加最近的数据,在这种情况下:

04/02/19 103.0    89.5     77.5     226.0
生成以下df,然后将其保存为“旧df”,以便我可以在第二天重复此过程:

Date     Stock A  Stock B  Stock C  Stock D
01/02/19 100.0    87.0     74.0     228.0
02/02/19 101.5    87.5     75.0     227.0
03/02/19 102.0    89.0     76.5     225.5
04/02/19 103.0    89.5     77.5     226.0
我想代码必须使用以下一些变体:

old_df.append(new_df)
但是里面有一些东西可以扫描旧的_df中已经存在的数据

任何帮助都将不胜感激

这是我目前的代码:

import requests
import json
import pandas as pd
import datetime as dt

#total_data = pd.read_csv('1m_bin_db.csv')
#total_data.set_index('Date', inplace=True)

def get_bars(symbol, interval):
   url = 'https://api.binance.com/api/v1/klines?symbol=' + symbol + '&interval=' + interval + '&limit=1000'
   data = json.loads(requests.get(url).text)
   df = pd.DataFrame(data)
   df.columns = ['open_time',
                 'o', 'h', 'l', 'c', 'v',
                 'close_time', 'qav', 'num_trades',
                 'taker_base_vol', 'taker_quote_vol', 'ignore']
   df.index = [dt.datetime.fromtimestamp(x/1000.0) for x in df.close_time]
   return df

coins = ['ADABTC']

dfs = []
for coin in coins:
    get_data = get_bars(coin, '1m')
    df = get_data[['o', 'h', 'l', 'c', 'v']].add_prefix(coin + '_')
    df = df.apply(lambda x: pd.to_numeric(x, errors='coerce'))
    dfs.append(df)

prices_1m = pd.concat(dfs, axis=1)
prices_1m.index.name = 'Date'
当我从CSV打印
total_data
时,我得到:

                         ADABTC_o  ADABTC_h    ...     ADABTC_c  ADABTC_v
Date                                           ...                       
2019-02-15 12:41:59.999  0.000011  0.000011    ...     0.000011   48805.0
2019-02-15 12:42:59.999  0.000011  0.000011    ...     0.000011     837.0
2019-02-15 12:43:59.999  0.000011  0.000011    ...     0.000011   19430.0
2019-02-15 12:44:59.999  0.000011  0.000011    ...     0.000011   15319.0
2019-02-15 12:45:59.999  0.000011  0.000011    ...     0.000011  769414.0
当我打印
prices\u 1m
时,我得到:

                         ADABTC_o  ADABTC_h    ...     ADABTC_c  ADABTC_v
Date                                           ...                       
2019-02-15 12:43:59.999  0.000011  0.000011    ...     0.000011   19430.0
2019-02-15 12:44:59.999  0.000011  0.000011    ...     0.000011   15319.0
2019-02-15 12:45:59.999  0.000011  0.000011    ...     0.000011  773414.0
2019-02-15 12:46:59.999  0.000011  0.000011    ...     0.000011    7449.0
2019-02-15 12:47:59.999  0.000011  0.000011    ...     0.000011       0.0
因此,我只想将最后两行粘贴在
total_data
的底部,我做到了:

df = total_data.append(prices_1m).drop_duplicates()
结果如下:

                            ADABTC_o  ADABTC_h    ...     ADABTC_c  ADABTC_v
Date                                              ...                       
2019-02-15 12:43:59.999     0.000011  0.000011    ...     0.000011   19430.0
2019-02-15 12:44:59.999     0.000011  0.000011    ...     0.000011   15319.0
2019-02-15 12:45:59.999     0.000011  0.000011    ...     0.000011  769414.0
2019-02-15 12:45:59.999000  0.000011  0.000011    ...     0.000011  773414.0
2019-02-15 12:46:59.999000  0.000011  0.000011    ...     0.000011    7449.0
因此,我认为问题在于数据本质上是“实时的”,因此12:45:59.999是
total_data
中的最后一个数据点,我可能在60秒数据周期剩下10秒时获得了该数据。因此,在
prices\u 1m
中,12:45:59.999数据点完全更新,这解释了重复时间与不同“V”列之间的差异。所以我觉得我们就快到了,但我希望
prices\u 1m
优先于
total\u data
,所以最新的数据附加到
total\u data

2019-02-15 12:45:59.999  0.000011  0.000011    ...     0.000011  773414.0
因此我希望该行是2019-02-15 12:45:59.999的条目,然后继续从那里追加

我在打印时得到(total_data.index):


如果日期不是索引,则使用
append
drop_duplicates()

old_df.append(new_df).drop_duplicates('Date')
如果可能更改数据,并且希望保留最新的值:

df.append(df1).sort_values('Date',ascending=False).drop_duplicates('Date')

我相信您需要使用
DatetimeIndex
,而不是
merge
by
date
列:

coins = ['ADABTC']

dfs = []
for coin in coins:
    get_data = get_bars(coin, '1m')
    df = get_data[['o', 'h', 'l', 'c', 'v']].add_prefix(coin + '_')
    df = df.apply(lambda x: pd.to_numeric(x, errors='coerce'))
    dfs.append(df)

prices_1m = pd.concat(dfs, axis=1)
prices_1m.to_csv('1m_bin_db.csv')
然后:

total_data.index = pd.to_datetime(total_data.index)

df = total_data.append(prices_1m)
df = df[~df.index.duplicated(keep='last')]

存在DatetimeIndex?是否需要删除所有重复行?如果日期为index,则为“是”。)好吧,我同意你的看法,这听起来很明智。让我来玩玩这一切,我会让你知道的。谢谢geezer@topbantz-是的,如果每个循环中的日期时间在几秒钟内有所不同,请告诉我。嗨,伙计,刚刚编辑了我的问题。所以我基本上还有一个小问题,我希望我已经解释清楚了。老兄,这已经成功了,回答很糟糕,非常感谢你的帮助!