ENH: Splitting datetime events in a df based on a datetime interval 
#### Is your feature request related to a problem?
I have transaction data, where events start at a given point in time and then end at a given point in time.  In order to see what events are ongoing over the course of time as well as allocate time to a specified time interval, multiple rows need to be made indicating that an event is still ongoing if it spans greater than the time interval specified. (i.e. if a row starts on Monday and ends on Wednesday and my time interval is 1 day, there needs to be 3 rows, 1 for when the event began on Monday then ending at just before midnight, 1 for Tuesday at midnight ending just before the following midnight, and 1 for Wednesday at midnight to the event end time.

It would be nice if given a dataframe and indicating start column, end column, and time interval, a method returned a dataframe that made those necessary cuts and filled in the gaps with extra rows.   

#### Describe the solution you'd like


```
def split_events(self, start, end, freq, show_event_id=False):
    """
        Takes properly formatted pandas.DataFrame of events and adds rows for
        events that cross into multiple intervals so each row falls under one interval

        Args:
            start (str): name of start datetime.datetime formatted column
            stop (str): name of end datetime.datetime formatted column
            freq (str): frequency string
            show_event_id (bool): adding id column for reverse mapping  

        Returns:
            pandas.DataFrame: formatted where events that cross over into multiple
                                            intervals are separated into separate events
    """

>>> df = pd.DataFrame([['2020-06-01 08:06:00', '2020-06-01 09:14:00', 'bar'],
...                 columns=['start', 'end', 'foo'])  

>>> df
     start                  stop                  foo
0  '2020-06-01 08:06:00'  '2020-06-01 09:14:00'  bar

>>> df.split_events(start='start', end='end', freq='30m')
     start                  stop                  foo
0  '2020-06-01 08:06:00'  '2020-06-01 08:30:00'  bar
1  '2020-06-01 08:30:00'  '2020-06-01 09:00:00'  bar
2  '2020-06-01 09:00:00'  '2020-06-01 09:14:00'  bar

>>> df.split_events(start='start', end='end', freq='30m', show_event_id=True)
    id   start                  stop                   foo
0    0  '2020-06-01 08:06:00'  '2020-06-01 08:30:00'  bar
1    0  '2020-06-01 08:30:00'  '2020-06-01 09:00:00'  bar
2    0  '2020-06-01 09:00:00'  '2020-06-01 09:14:00'  bar
```

#### API breaking implications
I see this as a standalone method so I don't believe it would affect the API

#### Describe alternatives you've considered
Searched exhaustively for similar methods that will accomplish this task and have been unable to find an existing solution.  Interpolate comes close but depends on a reference column, in this instance our reference is a specified time interval.

The following link also seems to have functionality that can be leveraged to accomplish the problem but I haven't been able to find anything straightforward ([link](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases))


#### Additional context

Probably more computational intensive than it needs to be but this is a function I have been using to split events by day.  One of the reasons it is done in this fashion is to make sure any additional columns passed in the df are also replicated for each row.

```python
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

def split_events_by_day(df, start='DateTimeStart', stop='DateTimeEnd'):
    """
        Takes properly formatted pandas.DataFrame of events and adds rows for
        events that cross into multiple days so each row falls under same day

        Args:
            df (pandas.DataFrame): formatted with start and stop columns formatted
                                                  as datetime.datetime
            start (str): name of start datetime.datetime formatted column
            stop (str): name of stop datetime.datetime formatted column

        Returns:
            pandas.DataFrame: formatted where events that cross over into multiple
                                            days are separated into separate events, an
                                            'event_id' is added for reverse mapping
    """
 
    df['event_id'] = np.arange(len(df)) # add indexing col for events
  
    for index, row in df.iterrows():

        row = row.copy() # making copy of row for editing

        # testing if event that starts and stops in the same day
        if (row[start].date()) == (row[stop].date()):
            pass # leave row as is
 
        # testing if event that stops on a different day than it started
        else:
            # number of calendar days in timespan
            days = (
                row[stop].replace(hour=0,minute=0,second=0 
                - row[start].replace(hour=0,minute=0,second=0)
            ).days

            next_day = (
                row[start].replace(hour=0,minute=0,second=0)
                + timedelta(days=1)
            )

            stop_time = row[stop]

            # assigning start calendar day cut to current row being evaluated
            df.at[index, stop] = next_day

            # adding rows for each calendar day in timespan not on start/stop
            # calendar day
            while days > 1:
                row = row.copy()
                row[start] = next_day
                next_day += timedelta(days=1)
                row[stop] = next_day
                df = df.append(row)
                days -= 1

            row[start] = next_day
            row[stop] = stop_time

            # adding row for stop calendar day cut to current row being
            # evaluated
            df = df.append(row)

    return df

```
