Python 2.7 и Pandas объединяют 2 файла CSV с данными Forex

У меня есть два файла 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

merged.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')

person killerkhan    schedule 09.07.2013    source источник
comment
они должны быть в другой день (это опечатка)? Я не понимаю, какой в ​​этом смысл (зачем просто копировать значение Close?)   -  person Andy Hayden    schedule 09.07.2013
comment
Энди, извини, что это была моя ошибка. это была опечатка, я исправил ее и отредактировал исходный пост. почему просто скопируйте близкое значение, я использую Altreva Adaptive Modeler, и он позволяет моделировать на основе одного инструмента, а последняя версия позволяет вам добавлять еще одну точку данных в моделирование, поэтому я выбираю близкую цену золота для использования в моделист. Я могу использовать только один дополнительный столбец, иначе я буду использовать все столбцы из второго файла CSV, но пока просто закройте столбец №4.   -  person killerkhan    schedule 09.07.2013


Ответы (2)


Если я правильно понял ваш вопрос, Энди в своем комментарии был прав. Вы не хотите объединять два, вы хотите скопировать столбец одного в другой.

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), чтобы получить ожидаемый ответ.

person TomAugspurger    schedule 09.07.2013
comment
вот что я пробовал: импортировать панды как 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.to_csv (' C: \ IQFEED \ python.csv ', index = False) - person killerkhan; 10.07.2013
comment
Спасибо, Том, это сработало. Я отредактировал окончательный рабочий код выше. если вы можете придумать что-нибудь еще, что можно добавить или удалить из кода, дайте мне знать. еще раз спасибо - person killerkhan; 10.07.2013
comment
Есть ли причина, по которой вы не записываете столбец индекса в csv? Вроде бы полезно было бы оставить. - person TomAugspurger; 10.07.2013
comment
не знаете как? это сделает это? df.to_csv (C: \ IQFEED \ python.csv, index = True) - person killerkhan; 10.07.2013
comment
Или вы можете просто оставить индекс пустым. По умолчанию это правда :). Таким образом, 1_ - person TomAugspurger; 10.07.2013
comment
Том, как бы то ни было, использовать не имена столбцов, а номера столбцов? как вместо близкого использования столбца №4? - person killerkhan; 10.07.2013
comment
Несколько способов. Либо избегайте их с самого начала, не передавая names=[ ] в read_csv, либо замените их перед записью на df.columns = range(len(df.columns)). См. здесь документацию по параметрам чтения / записи. - person TomAugspurger; 10.07.2013

Предполагая, что столбцы даты и времени одинаковы, вы можете просто сделать

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

df = pd.merge(df1,df2)

И он должен объединить их, используя одни и те же столбцы.

* при условии, что я правильно понял ваш вопрос.

person Matt    schedule 09.07.2013
comment
Мэтт, объединит ли приведенное выше оба файла csv на основе общего совпадения даты и времени в строке? а также будет ли он просто добавлять закрытие или столбец № 4 из второго файла CSV в объединенный файл? - person killerkhan; 09.07.2013
comment
Если я правильно помню, он просто объединит общие столбцы и добавит, чтобы все уникальные столбцы остались такими, какие они есть. - person Matt; 09.07.2013