2016-06-15 2 views
1

У меня есть два csv fies с разными столбцами. Table1Присоединение к CSV или таблицам

title stage jan  time 
darn 3.001 0.421 5/23/2016 13:14 
darn 2.054 0.1213 5/24/2016 14:14 
ok  2.829 1.036 5/23/2016 14:14 
five 1.115 1.146 5/23/2016 17:14 
three  2  5 5/23/2016 21:14 

Таблица 2

title mar  apr  may jun  date 
darn 0.631 1.321 0.951 1.751 5/23/2016 12:14 
ok  1.001 0.247 2.456 0.3216 5/24/2016 18:41 
three 0.285 1.283 0.924 956  5/25/2016 17:41 

мне нужно присоединиться к ним фильтруются по названию (первичный ключ) и при условии, что время в поле даты в таблице 2, равно (время - 1 часы) в поле даты в таблице 1. Таким образом, на выходе должно быть что-то вроде этого:

title stage jan  mar  apr  may jun  date 
darn 3.001 0.421 0.631 1.321 0.951 1.751 5/23/2016 13:14 

мне было интересно, если это может быть сделано с помощью панд или SQL-запрос является наилучшим способом продвижения вперед. Я поднял глаза и увидел, что панды могут сливаться на основе уникального ключевого значения. импорт панды как э.р.

a = pd.read_csv("1.csv") 
b = pd.read_csv("2.csv") 
merged = a.merge(b, on='title') 
merged.to_csv("output.csv", index=False) 

Это программа. Я изо всех сил о том, как установить условие для даты field.Bot SQL и решение Панды приветствуется

ответ

0

I Would создать фиктивный столбец (чтобы соответствовать "времени" в df):

In [11]: df1["time"] = df1["date"] + pd.offsets.Hour(1) 

Теперь вы можете объединить чисто:

In [12]: df.merge(df1) 
Out[12]: 
    title stage jan    time mar apr may jun    date 
0 darn 3.001 0.421 2016-05-23 13:14:00 0.631 1.321 0.951 1.751 2016-05-23 12:14:00 

In [13]: df.merge(df1, on=["title", "time"]) # potentially less reckless to specify columns 
Out[13]: 
    title stage jan    time mar apr may jun    date 
0 darn 3.001 0.421 2016-05-23 13:14:00 0.631 1.321 0.951 1.751 2016-05-23 12:14:00 

Примечание: Это означает, что вам не нужно выполнять полное слияние (только на название), которое потенциально может быть очень неэффективным.

+0

не может объединить объекты 'str' и 'Hour'. Он выдает эту ошибку –

+0

@DigantaBharali должен быть столбцом datetime (не строка), вам нужно сначала 'df [" time "] = pd.to_datetame (df [" time "])' и 'df' [ date "] = pd.to_datetame (df [" date "])'. Это даты не строки, поэтому они должны быть преобразованы как таковые. Вы также можете сделать это, читая в csv, используя 'parse_dates'. –

+0

все работает нормально. Просто, что он не соответствует столбцам времени, он дает мне нулевой вывод только с заголовками. Другой вопрос - во время слияния, можем ли мы указать диапазон, например, «если он выпадет в течение одного часа», он вернет эту строку? –

1

предполагая время и дата переменные распознаются как таковые панд, просто добавить

merged = merged[merged.date == (merged.time - pd.Timedelta('1 hours'))] 
+0

Но вы не подбираете дату для данного поля. Я не думаю, что это сработает, если в таблице указаны дубликаты заголовков. –

+0

неподдерживаемый тип операндов для -: 'numpy.ndarray' и 'Timedelta' –

+0

вы можете фильтровать после сопоставления. это должна быть последняя строка вашего кода. –

Смежные вопросы