I would use PyQGIS with the `datetime` and `csv` modules for this. Copy and paste the script below into a new editor in the Python console. You will just need to edit the output path for the CSV file and the name of the text field in your GeoPackage (see comments in the code), then select your gpkg as the active layer and run the script.

<!-- language-all: pyqgis -->

    from datetime import datetime, timedelta
    
    import csv
    
    # Edit the line below to the path where you want your output csv written
    output_csv = 'Path/To/Attributes.csv'
    
    # Edit below to match the name of the text field in your GeoPackage
    fld_name = 'Your Field Name'
    
    lyr = iface.activeLayer()
    
    csv_tbl = open(output_csv, mode='w', newline='')
    writer = csv.writer(csv_tbl)
    writer.writerow(['Column1', 'Column2'])
    
    for ft in lyr.getFeatures():
        attr = ft[fld_name]
        start_date_txt = attr.split('to')[0][-11:][:-1]
        start_date = datetime.strptime(start_date_txt, '%Y_%m_%d').date()
        writer.writerow([attr, start_date_txt])
        end_date_txt = attr.split('to')[1][1:]
        end_date = datetime.strptime(end_date_txt, '%Y_%m_%d').date()
        gaps = end_date - start_date
        gap_days = gaps.days-1
        day_count = 1
        for i in range(gap_days):
            fill_date = start_date+timedelta(days=day_count)
            fill_date_txt = datetime.strftime(fill_date, '%Y_%m_%d')
            writer.writerow([attr, fill_date_txt])
            day_count+=1
        writer.writerow([attr, end_date_txt])
        
    csv_tbl.close()
    del writer
    
    print('Done')

I tested with this dummy geopackage (one string field containing the information).

[![enter image description here][1]][1]

After running the above script (shown here in the Python console)

[![enter image description here][2]][2]

The output CSV file was produced:

[![enter image description here][3]][3]

**Edit:**

To adapt the script to write the location to a third column, we just need to extract it from the attribute string. In this case we can simply split the string with the underscore character and access the first element (index 0) of the list returned by the `split()` method. We then add it to the list of values passed to each `writerow()` call on the csv writer object.

I have also added comments to the adapted code to help you step through the logic. For what it's worth, the string manipulation could probably be done more 'slickly' with Regexp but I'm far from competent with Regexp so here we are!

    from datetime import datetime, timedelta
    
    import csv
    
    # Edit the line below to the path where you want your output csv written
    output_csv = 'Path/To/Attributes.csv'
    
    # Edit below to match the name of the text field in your GeoPackage
    fld_name = 'Your Field Name'
    
    # Get the active layer
    lyr = iface.activeLayer()
    
    # Open the CSV table for writing
    csv_tbl = open(output_csv, mode='w', newline='')
    
    # Create a csv writer object
    writer = csv.writer(csv_tbl)
    
    # Write the column headers
    writer.writerow(['Column1', 'Column2', 'Column3'])
    
    # Iterate over the geopackage layer features
    for ft in lyr.getFeatures():
        # Get the features value from the relevant field
        attr = ft[fld_name]
        # Split out the location part of the string
        location = attr.split('_')[0]
        # Split out the start date as a string using split() plus string slicing
        start_date_txt = attr.split('to')[0][-11:][:-1]
        # convert the start date text to an actual Python date object
        start_date = datetime.strptime(start_date_txt, '%Y_%m_%d').date()
        # Write row to csv
        writer.writerow([attr, start_date_txt, location])
        # Split out end date as a string
        end_date_txt = attr.split('to')[1][1:]
        # Convert to Python date object
        end_date = datetime.strptime(end_date_txt, '%Y_%m_%d').date()
        # Subtract start date from end date to calculate difference in days
        gaps = end_date - start_date
        # Subtract one day to get number of dates to fill in
        gap_days = gaps.days-1
        # Initialize day counter
        day_count = 1
        # Create the number of new date objects required adding 1 day on each iteration
        for i in range(gap_days):
            fill_date = start_date+timedelta(days=day_count)
            # Convert the date back to a string separated by underscores
            fill_date_txt = datetime.strftime(fill_date, '%Y_%m_%d')
            # Write row to csv
            writer.writerow([attr, fill_date_txt, location])
            # Increment the day counter
            day_count+=1
        # Write row to csv
        writer.writerow([attr, end_date_txt, location])
    
    # Close the csv table and delete the writer object to release the csv file
    csv_tbl.close()
    del writer
    
    print('Done')

  [1]: https://i.sstatic.net/i7FaC.png
  [2]: https://i.sstatic.net/E7an5.png
  [3]: https://i.sstatic.net/5Zp2V.png