Ежедневное преобразование данных для каждого диапазона дат, указанного в строке фрейма данных

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

У меня есть следующие типы данных: введите описание изображения здесь

Я хочу выводить данные в нижеприведенных ежедневных формах (ниже приведен пример, в котором я хочу преобразовать данные строки 1 в Daily, а затем строки 2 и … (Диапазон дат не является фиксированным)): введите описание изображения здесь

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

 # data1 = dataframe name
data1['Daily']=(data1['Total Spot']/((data1['Event End']-data1['Event Start']).dt.days) 1)
for date in data1:
    pd.date_range(data1['Event Start'], data1['Event End'],freq='D')
  

Что я должен включить в приведенный выше код, чтобы получить желаемый результат?

Ответ №1:

Вы можете использовать понимание списка с выравниванием для новых DataFrame , а затем DataFrame.merge вместе с исходными данными:

 data1 = pd.DataFrame({'Event Start':['03/28/2018','04/02/2018'],
                      'Event End':['04/03/2018','04/05/2018'],
                      'Team 1':['AAB','AAC'],
                      'Team 2':['BBB','ABC'],
                      'Total Spot':[160, 350]})

c = ['Event Start','Event End']
data1[c] = data1[c].apply(pd.to_datetime)

data1['Daily']=(data1['Total Spot']/((data1['Event End']-data1['Event Start']).dt.days) 1)
print (data1)
  Event Start  Event End Team 1 Team 2  Total Spot       Daily
0  2018-03-28 2018-04-03    AAB    BBB         160   27.666667
1  2018-04-02 2018-04-05    AAC    ABC         350  117.666667

L = [(i, x) for i, s, e in zip(data1.index, data1['Event Start'], data1['Event End']) 
            for x in pd.date_range(s, e)]

df = (pd.DataFrame(L, columns=['idx','Day'])
        .merge(data1.drop(c   ['Total Spot'], axis=1), left_on='idx', right_index=True)
        .drop('idx', axis=1))
  

 print (df)
          Day Team 1 Team 2       Daily
0  2018-03-28    AAB    BBB   27.666667
1  2018-03-29    AAB    BBB   27.666667
2  2018-03-30    AAB    BBB   27.666667
3  2018-03-31    AAB    BBB   27.666667
4  2018-04-01    AAB    BBB   27.666667
5  2018-04-02    AAB    BBB   27.666667
6  2018-04-03    AAB    BBB   27.666667
7  2018-04-02    AAC    ABC  117.666667
8  2018-04-03    AAC    ABC  117.666667
9  2018-04-04    AAC    ABC  117.666667
10 2018-04-05    AAC    ABC  117.666667
  

Другое подобное решение:

 zipped = zip(data1['Team 1'], data1['Team 2'], 
             data1['Daily'], data1['Event Start'], data1['Event End'])
L = [(x, t1, t2, d) for t1, t2, d, s, e in zipped for x in pd.date_range(s, e)]
print (L)

df = pd.DataFrame(L, columns=['Day', 'Team 1','Team 2','Daily'])
print (df)
          Day Team 1 Team 2       Daily
0  2018-03-28    AAB    BBB   27.666667
1  2018-03-29    AAB    BBB   27.666667
2  2018-03-30    AAB    BBB   27.666667
3  2018-03-31    AAB    BBB   27.666667
4  2018-04-01    AAB    BBB   27.666667
5  2018-04-02    AAB    BBB   27.666667
6  2018-04-03    AAB    BBB   27.666667
7  2018-04-02    AAC    ABC  117.666667
8  2018-04-03    AAC    ABC  117.666667
9  2018-04-04    AAC    ABC  117.666667
10 2018-04-05    AAC    ABC  117.666667
  

Комментарии:

1. Большое вам спасибо @jezrael, у меня все работает нормально.