【问题标题】:Python 2.7 and Pandas merge 2 csv files with Forex DataPython 2.7 和 Pandas 将 2 个 csv 文件与外汇数据合并
【发布时间】:2013-07-07 13:04:32
【问题描述】:

我有两个 csv 文件

1:eurusd.csv 2:xauusd.csv

文件中没有标题,但数据是日期时间、开盘价、最高价、最低价、收盘价、成交量。每个文件都有以下类型的数据...

eurusd.csv:

02/23/2009 18:01,1.27090,1.27110,1.27040,1.27050,204
02/23/2009 18:02,1.27060,1.27060,1.27000,1.27040,211
02/23/2009 18:03,1.27040,1.27050,1.27010,1.27040,82
02/23/2009 18:04,1.27020,1.27080,1.27020,1.27060,98

xauusd.csv

02/23/2009 18:01,991.260,992.120,990.800,991.840,69
02/23/2009 18:02,991.800,992.260,991.200,991.870,74
02/23/2009 18:04,991.820,991.830,990.700,991.320,74

我想根据日期时间列合并数据,该列是两个文件中的第一列。如您所见,第二个文件与第一个文件没有完全相同的记录,因此缺少第二个文件中的一些数据,但没关系。我想根据它们之间的匹配日期磁贴字段将 Close 列从第二个文件带到第一个文件

所以最终合并的 csv 文件将具有以下列... 日期时间、开盘价、最高价、最低价、收盘价、成交量、CloseFromSecondCsv

合并的.csv

02/23/2009 18:01,1.27090,1.27110,1.27040,1.27050,204,991.840
02/23/2009 18:02,1.27060,1.27060,1.27000,1.27040,211,991.870
02/23/2009 18:03,1.27040,1.27050,1.27010,1.27040,82,0
02/23/2009 18:04,1.27020,1.27080,1.27020,1.27060,98,991.320

我不知道该怎么做。提前致谢


基于 TomAugspurger 回答的最终工作代码:

import pandas as pd
df1 = pd.read_csv("C:\IQFEED\XAUUSDO.COMP_1.csv", index_col=0, names=['time', 'open', 'high', 'low', 'close', 'volume'], parse_dates=True)
df2 = pd.read_csv("C:\IQFEED\EURUSD.COMP_1.csv", index_col=0, names=['time', 'open', 'high', 'low', 'close', 'volume'], parse_dates=True)
df2['other_close'] = df1['close']
df2.fillna(0)
df2.to_csv('C:\IQFEED\python.csv')

我发现只能使用列号...

import pandas as pd
df1 = pd.read_csv("C:\IQFEED\XAUUSD.txt", index_col=0, usecols=[0,4], parse_dates=True, header=None)
df2 = pd.read_csv("C:\IQFEED\EURUSD.txt", index_col=0, usecols=[0,1,2,3,4,5], parse_dates=True, header=None)
df2[6] = df1[4]
df2.to_csv('C:\IQFEED\python1.csv')

【问题讨论】:

  • 他们是不是打算在不同的日子(这是错字)?我不明白这有什么意义(为什么只复制 Close 值?)
  • 安迪,对不起,这是我的错误。这是一个错字,我修复了它并编辑了原始帖子。为什么只复制收盘价是我使用的是 Altreva Adaptive Modeler,它允许基于单个工具进行建模,最新版本还允许您在建模中添加另一个数据点,所以我选择使用黄金收盘价建模师。我只能使用单个附加列,否则将使用第二个 csv 文件中的所有列,但现在只关闭或列 #4。

标签: python csv merge pandas forex


【解决方案1】:

如果我正确理解您的问题,安迪在他的评论中的想法是正确的。您不想合并为两列,而是要将一列复制到另一列。

In [48]: df1 = pd.read_csv(StringIO(b), index_col=0, names=['time', 'open', 'high', 'low', 'close', 'volume'], parse_dates=True)


In [49]: df2 = pd.read_csv(StringIO(a), index_col=0, names=['time', 'open', 'high', 'low', 'close', 'volume'], parse_dates=True)


In [71]: df1
Out[71]: 
                       open    high    low   close  volume
time                                                      
2009-02-23 18:01:00  991.26  992.12  990.8  991.84      69
2009-02-23 18:02:00  991.80  992.26  991.2  991.87      74
2009-02-23 18:04:00  991.82  991.83  990.7  991.32      74

In [72]: df2
Out[72]: 
                       open    high     low   close  volume
time                                                       
2009-02-23 18:01:00  1.2709  1.2711  1.2704  1.2705     204
2009-02-23 18:02:00  1.2706  1.2706  1.2700  1.2704     211
2009-02-23 18:03:00  1.2704  1.2705  1.2701  1.2704      82
2009-02-23 18:04:00  1.2702  1.2708  1.2702  1.2706      98





In [51]: df2['other_close'] = df1['close']


In [52]: df2
Out[52]: 
                       open    high     low   close  volume  other_close
time                                                                    
2009-02-23 18:01:00  1.2709  1.2711  1.2704  1.2705     204       991.84
2009-02-23 18:02:00  1.2706  1.2706  1.2700  1.2704     211       991.87
2009-02-23 18:03:00  1.2704  1.2705  1.2701  1.2704      82          NaN
2009-02-23 18:04:00  1.2702  1.2708  1.2702  1.2706      98       991.32

您可以通过df2.fillna(0) 得到您想要的答案。

【讨论】:

  • 这是我尝试过的: import pandas as pd df1 = pd.read_csv("C:\IQFEED\XAUUSDO.COMP_1.csv", index_col=0,names=['time', 'open ', 'high', 'low', 'close', 'volume'], parse_dates=True) df2 = pd.read_csv("C:\IQFEED\EURUSD.COMP_1.csv", index_col=0, names=['时间', '开', '高', '低', '关闭', '体积'], parse_dates=True) df2['other_close'] = df1['close'] df2.to_csv('C:\IQFEED \python.csv',index=False)
  • 谢谢汤姆,这很有效。我编辑了上面的最终工作代码。如果您能想到要从代码中添加或删除的任何其他内容,请告诉我。再次感谢
  • 您没有将索引列写入 csv 是否有原因?保留下来似乎很有用。
  • 不知道怎么做?这会做吗? df.to_csv("C:\IQFEED\python.csv", index=True)
  • 或者您可以将索引留空。默认情况下是这样的:)。所以df.to_csv("C:\IQFEED\python.csv')
【解决方案2】:

假设日期和时间列相同,您可以这样做

df1 = pd.read_csv('file1',sep=r'\s+')
df2 = pd.read_csv('file2',sep=r'\s+')

df = pd.merge(df1,df2)

它应该使用相同的列合并它们。

*假设我正确理解了您的问题。

【讨论】:

  • Matt,上面会根据行中的共同匹配日期时间合并两个 csv 文件吗?它还会将第二个 csv 文件中的关闭或第 4 列添加到合并文件中吗?
  • 如果我没记错的话,它只会合并公共列并添加保持所有唯一列不变。
猜你喜欢
  • 1970-01-01
  • 2017-09-01
  • 2017-06-07
  • 2018-06-11
  • 2016-03-16
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多