Преобразуйте строку данных Pandas, содержащую диапазон даты и времени, в новый кадр данных со строкой для каждой даты вместе с часами, включенными в эту дату - PullRequest
0 голосов
/ 12 февраля 2019

Итак, у меня есть столбцы StartDateTime и EndDateTime в моем фрейме данных, и я хочу создать новый фрейм данных со строкой для каждой даты в диапазоне дат и времени, но я также хочу, чтобы количество часов этой даты было включено вдиапазон дат.

In [11]: sessions = pd.DataFrame({'Start':['2018-01-01 13:00:00','2018-03-01 16:30:00'],
'End':['2018-01-03 07:00:00','2018-03-02 06:00:00'],'User':['Dan','Fred']})
In [12]: sessions
Out[12]:    
                Start                 End User
0 2018-01-01 13:00:00 2018-01-03 07:00:00  Dan 
1 2018-03-01 16:30:00 2018-03-02 06:00:00 Fred 

Желаемый фрейм данных:

Date        Hours   User
2018-01-01  11      Dan
2018-01-02  24      Dan
2018-01-02  7       Dan
2018-03-01  7.5     Fred
2018-03-02  6       Fred

Я видел множество примеров, которые просто генерировали фрейм данных для каждой даты в диапазоне дат (например, Расширениекадр данных pandas с диапазоном дат в столбцах ), но без дополнительного поля часов в дате, включенного в диапазон.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

что-то вроде этого будет работать, если вы не возражаете только против целых чисел;

df['date'] = df['Date'].dt.date
gb = df.groupby(['date', 'User'])['Date'].size()
print(gb)

date        User
2018-01-01  Dan     11
2018-01-02  Dan     24
2018-01-03  Dan      8
2018-03-01  Fred     8
2018-03-02  Fred     6
Name: Date, dtype: int64
0 голосов
/ 20 февраля 2019

Я не знаю, что это самое чистое решение, но, похоже, оно работает.

In [13]: sessions = pd.DataFrame({'Start':['2018-01-01 13:00:00','2018-03-01 16:30:00'],
'End':['2018-01-03 07:00:00','2018-03-02 06:00:00'],'User':['Dan','Fred']})

преобразование начала и конца в дату и время

In [14]: sessions['Start']=pd.to_datetime(sessions['Start'])
    sessions['End']=pd.to_datetime(sessions['End'])

создание строки для каждой даты вДиапазон

In [15]: dailyUsage = pd.concat([pd.DataFrame({'Date': 
pd.date_range(pd.to_datetime(row.Start).date(), row.End.date(), freq='D'),'Start':row.Start,
               'User': row.User,
               'End': row.End}, columns=['Date', 'Start','User', 'End']) 
           for i, row in sessions.iterrows()], ignore_index=True)

функция для расчета часов на дату, основанная на дате начала, времени окончания и специальной дате

In [16]: def calcDuration(x):
    date=  x['Date']
    startDate = x['Start']
    endDate = x['End']

    #starts and stops on same day
    if endDate.date() == startDate.date():
        return (endDate - startDate).seconds/3600

    #this is on the start date
    if (date.to_pydatetime().date() - startDate.date()).days == 0:
        return 24 - startDate.hour

    #this is on the end date
    if (date.to_pydatetime().date() - endDate.date()).days == 0:
        return startDate.hour

    #this is on an interior date
    else:
        return 24

вычисления часов для каждой даты

In [17]: dailyUsage['hours'] = dailyUsage.apply(calcDuration,axis=1)

In [18]: dailyUsage.drop(['Start','End'],axis=1).head()
Out [18]: 
        Date User  hours
0 2018-01-01  Dan     11 
1 2018-01-02  Dan     24 
2 2018-01-03  Dan     13 
3 2018-03-01 Fred      8 
4 2018-03-02 Fred     16 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...