Панды: цикл разницы дат между столбцами с похожими именами (ACD и ECD) - PullRequest
0 голосов
/ 30 апреля 2019

Я работаю в Jupyter и у меня большое количество столбцов, многие из которых датируются.Я хочу создать цикл, который будет возвращать новый столбец с разницей в дате между двумя столбцами с одинаковыми именами.

Например:

df['Site Visit ACD']
df['Site Visit ECD']
df['Sold ACD (Loc A)']
df['Sold ECD (Loc A)']

Новый столбец будет иметь столбец df [«Время цикла посещения объекта»] = разница в дате между ACD и ECD.Как правило, это всегда будет столбец, который содержит «ACD» минус столбец, который содержит «ECD».Как я могу написать это?

Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Как правило, это всегда будет столбец, который содержит «ACD» минус столбец, который содержит «ECD».

В этом ответе предполагается, что заголовки столбцов не шумные, т. Е. Отличаются только «ACD» / «ECD» и точно такие же, кроме (включая верхний / нижний регистр). Также предполагается, что всегда есть соответствующий столбец. Этот код не проверяет, перезаписывает ли он столбец, в который записывается разница дат.

Этот подход работает в линейном времени, поскольку мы перебираем набор столбцов один раз и напрямую обращаемся к соответствующему столбцу по имени.

test.csv

Site Visit ECD,Site Visit ACD,Sold ECD (Loc A),Sold ACD (Loc A)
2018-06-01,2018-06-04,2018-07-05,2018-07-06
2017-02-22,2017-03-02,2017-02-27,2017-03-02

Код

import pandas as pd

df = pd.read_csv("test.csv", delimiter=",")

for col_name_acd in df.columns:
    # Skip columns that don't have "ACD" in their name
    if "ACD" not in col_name_acd: continue

    col_name_ecd = col_name_acd.replace("ACD", "ECD")

    # we assume there is always a matching "ECD" column
    assert col_name_ecd in df.columns

    col_name_diff = col_name_acd.replace("ACD", "Cycle Time")
    df[col_name_diff] = df[col_name_acd].astype('datetime64[ns]') - df[col_name_ecd].astype('datetime64[ns]')

print(df.head())

выход

  Site Visit ECD Site Visit ACD Sold ECD (Loc A) Sold ACD (Loc A)  \
0     2018-06-01     2018-06-04       2018-07-05       2018-07-06   
1     2017-02-22     2017-03-02       2017-02-27       2017-03-02   

  Site Visit Cycle Time Sold Cycle Time (Loc A)  
0                3 days                  1 days  
1                8 days                  3 days  
1 голос
/ 30 апреля 2019

Следующий код сделает следующее:

  1. Найти столбцы, которые похожи (нечеткий коэффициент более 90, используя пакет fuzzywuzzy)
  2. Выполнить сравнение даты (или времени)
  3. Избегайте одинаковых вычислений, выполняемых с обеих сторон
  4. получить имя «Посещение сайта», если столбец называется более или менее так
  5. получить имя 'разница между' столбцом 1 'и' столбцом 2 ', если оно называется по-разному

Надеюсь, это поможет.

import pandas as pd
    from fuzzywuzzy import fuzz
    name = pd.read_excel('Book1.xlsx', sheet_name='name')
    unique = []
    for i in name.columns:
        for j in name.columns:
            if i != j and fuzz.ratio(i, j) > 90 and i+j not in unique:
                if 'Site Visit' in i:
                    name['Site Visit'] = name[i] - name[j]
                else:
                    name['difference between '+i+' and '+j] = name[i] - name[j]
                unique.append(j+i)
                unique.append(i+j)
    print(name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...