15

I have a pandas dataframe of bookings at a hotel. Each row is a booking, like this:

Name             Arrival       Departure     RoomNights
Trent Cotchin    29/10/2017    2/11/2017     4
Dustin Martin    1/11/2017     4/11/2017     3
Alex Rance       2/11/2017     3/11/2017     1

I want to use python to convert so that each row becomes a roomnight. The output would look like this:

Name             Arrival       Departure     RoomNights   RoomNight Date
Trent Cotchin    29/10/2017    2/11/2017     4            29/10/2017
Trent Cotchin    29/10/2017    2/11/2017     4            30/10/2017
Trent Cotchin    29/10/2017    2/11/2017     4            31/10/2017
Trent Cotchin    29/10/2017    2/11/2017     4            1/11/2017
Dustin Martin    1/11/2017     4/11/2017     3            1/11/2017
Dustin Martin    1/11/2017     4/11/2017     3            2/11/2017
Dustin Martin    1/11/2017     4/11/2017     3            3/11/2017
Alex Rance       2/11/2017     3/11/2017     1            2/11/2017

This allows me to easily sum the total number of roomnights for any given day/month.

0

1 Answer 1

21

Use:

#convert columns to datetime
df['Arrival'] = pd.to_datetime(df['Arrival'])
df['Departure'] = pd.to_datetime(df['Departure'])

#repeat rows
df = df.loc[df.index.repeat(df['RoomNights'])]
#group by index with transform for date ranges
df['RoomNight Date'] =(df.groupby(level=0)['Arrival']
                         .transform(lambda x: pd.date_range(start=x.iat[0], periods=len(x))))
#unique default index
df = df.reset_index(drop=True)
print (df)
            Name    Arrival  Departure  RoomNights RoomNight Date
0  Trent Cotchin 2017-10-29 2017-11-02           4     2017-10-29
1  Trent Cotchin 2017-10-29 2017-11-02           4     2017-10-30
2  Trent Cotchin 2017-10-29 2017-11-02           4     2017-10-31
3  Trent Cotchin 2017-10-29 2017-11-02           4     2017-11-01
4  Dustin Martin 2017-11-01 2017-11-04           3     2017-11-01
5  Dustin Martin 2017-11-01 2017-11-04           3     2017-11-02
6  Dustin Martin 2017-11-01 2017-11-04           3     2017-11-03
7     Alex Rance 2017-11-02 2017-11-03           1     2017-11-02
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.