У меня есть столбцы «дата начала» и «дата окончания». Я хочу превратить каждую строку в X строк, по одной на каждую из включающих дат - PullRequest
2 голосов
/ 30 января 2020

Я застрял с небольшой проблемой преобразования данных. Вот данные, которые у меня есть:

    start_date  end_date   ticket   info
    1/1/2020    1/3/2020   A        A_info
    1/5/2020    1/10/2020  B        B_info

И я sh, чтобы преобразовать их в такой формат:

    ticket  date      info 
    A       1/1/2020  A_info
    A       1/2/2020  A_info
    A       1/3/2020  A_info
    B       1/5/2020  B_info
    B       1/6/2020  B_info
    ...
    B       1/10/2020 B_info

Где число строк на элемент соответствует каждой день в начальном интервале. Я считаю, что гораздо проще редактировать / анализировать после загрузки в систему BI, если она находится в этом формате. Какой самый простой способ сделать это в pandas? Я уже получил массив дат для каждой строки, выполнив что-то вроде этого:

dates = [start + datetime.timedelta(days=x) for x in range((end-start).days)]

Но какой самый быстрый способ перебрать строки и расширить / продублировать их с правильными датами?

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Вы можете использовать метод resample для повышения дискретизации:

# combine date columns
df = df.melt(id_vars=['info', 'ticket'], value_name='date').drop('variable', axis=1)
# convert column 'date' to DateTime
df['date'] = pd.to_datetime(df['date'])
# upsample dataframe and fill missing values
df.set_index('date').resample('d').asfreq().bfill()

Вывод:

              info ticket
date                     
2020-01-01  A_info      A
2020-01-02  A_info      A
2020-01-03  A_info      A
2020-01-04  B_info      B
2020-01-05  B_info      B
2020-01-06  B_info      B
2020-01-07  B_info      B
2020-01-08  B_info      B
2020-01-09  B_info      B
2020-01-10  B_info      B
0 голосов
/ 30 января 2020

Используйте DataFrame.itertuples с concat для расширенных строк, а затем преобразуйте Series в DataFrame со значениями подкачки и индексом и используйте DataFrame.join для добавления все остальные столбцы, удалите последние ненужные столбцы:

s = pd.concat([pd.Series(r.Index,pd.date_range(r.start_date, r.end_date)) 
               for r in df.itertuples()])
df1 = (pd.DataFrame({'date':s.index}, s)
         .join(df).drop(['start_date','end_date'], axis=1)
         .reset_index(drop=True))
print (df1)
        date ticket    info
0 2020-01-01      A  A_info
1 2020-01-02      A  A_info
2 2020-01-03      A  A_info
3 2020-01-05      B  B_info
4 2020-01-06      B  B_info
5 2020-01-07      B  B_info
6 2020-01-08      B  B_info
7 2020-01-09      B  B_info
8 2020-01-10      B  B_info
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...