【问题标题】:Merging multiple ohlc csv with overlaps into one sorted csv file with pandas将多个具有重叠的 ohlc csv 合并到一个带有 pandas 的已排序 csv 文件中
【发布时间】:2023-03-12 14:59:02
【问题描述】:

我正在尝试将多个 OHLC csv 文件合并到一个文件中。我在互联网上下载了一些数据,但索引部分重叠。数据可能如下所示:

<file1>
o,h,l,c,v,t
...
364.4,364.4,364.4,364.4,155.0,2019-01-01 10:59:59
364.4,364.59,364.4,364.59,371.0,2019-01-01 11:00:00
364.59,364.59,364.59,364.59,305.0,2019-01-01 11:00:01

<file2>
o,h,l,c,v,t
364.4,364.59,364.4,364.59,1371.0,2019-01-01 11:00:00
364.59,364.59,364.59,364.59,305.0,2019-01-01 11:00:01
364.59,364.59,364.59,364.59,305.0,2019-01-01 11:00:02
364.59,364.59,364.59,364.59,305.0,2019-01-01 11:00:03
...

<file3>
o,h,l,c,v,t
364.4,364.4,364.4,364.4,155.0,2019-01-01 12:00:00
364.4,364.59,364.4,364.59,1371.0,2019-01-01 12:00:01
...

我需要什么...

<file_merged>
o,h,l,c,v,t
...
364.4,364.4,364.4,364.4,155.0,2019-01-01 10:59:59
364.4,364.59,364.4,364.59,371.0,2019-01-01 11:00:00
364.59,364.59,364.59,364.59,305.0,2019-01-01 11:00:01
364.59,364.59,364.59,364.59,305.0,2019-01-01 11:00:02
364.59,364.59,364.59,364.59,305.0,2019-01-01 11:00:03
...
364.4,364.4,364.4,364.4,155.0,2019-01-01 12:00:00
364.4,364.59,364.4,364.59,1371.0,2019-01-01 12:00:01
...

我找到了一种将数据加载到一个对象中的巧妙方法,但我错过了需要将无序列表合并到一个有序数据帧中的最后一部分,其中删除了双精度数据并对数据进行了排序。 pd.merge(left, right, index='t') 我想我可以在一个丑陋的循环中使用,但我想知道是否有更优雅的方式?到目前为止,这就是我加载数据的方式(没有丑陋的循环):

datadir = r'/home/test'
files = [i for i in os.listdir(datadir) if os.path.isfile(os.path.join(datadir, i)) and i.startswith('AAPL_')]
datalist = [pd.read_csv(datadir + '/' + filename, index_col='t') for filename in files]

提前致谢

【问题讨论】:

    标签: python pandas dataframe join merge


    【解决方案1】:

    使用pathlib.Path.glob获取datadir中所有以AAPL_开头的文件的路径,并使用pd.read_csv以及可选参数parse_datesindex_col,最后使用pd.concat连接所有dfs 并使用DataFrame.sort_indexindex 上的数据框进行排序。

    from pathlib import Path
    
    dfs = [pd.read_csv(p, parse_dates=['t'])
           for p in Path(datadir).glob(r'AAPL_*')]
    df = pd.concat(dfs).drop_duplicates('t').set_index('t').sort_index()
    

    结果:

    print(df)
                              o       h       l       c       v
    t                                                          
    2019-01-01 10:59:59  364.40  364.40  364.40  364.40   155.0
    2019-01-01 11:00:00  364.40  364.59  364.40  364.59  1371.0
    2019-01-01 11:00:01  364.59  364.59  364.59  364.59   305.0
    2019-01-01 11:00:02  364.59  364.59  364.59  364.59   305.0
    2019-01-01 11:00:03  364.59  364.59  364.59  364.59   305.0
    2019-01-01 12:00:00  364.40  364.40  364.40  364.40   155.0
    2019-01-01 12:00:01  364.40  364.59  364.40  364.59  1371.0
    

    【讨论】:

    • 感谢您的快速回复。乍一看还不错。还是要做数据检查。
    • @GrJP 当然。编码愉快!
    • 仍在尝试删除重复索引。尝试使用 .drop_duplicates(),但最终我的总数不匹配。在我的结果中,我在大约 90.000 行中缩短了大约 40 行。还在调查中……
    • 您正试图在同一时间删除重复的条目,对吧?
    • > 非常感谢。编辑可以解决问题。结果完全符合我的预期。祝你有美好的一天!
    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 2019-07-13
    • 2021-12-17
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2021-09-24
    相关资源
    最近更新 更多