如何用Python根据起止日期生成按年月拆分的时间序列数据集
拆分酒店可用日期范围并关联原数据的Pandas解决方案
需要将酒店数据集按可用起止日期拆分为每个年月对应一行的格式,同时保留酒店名称、地点等信息。原代码仅生成日期序列,未关联对应酒店数据,以下是两种可行方案:
方法1:循环遍历生成关联数据
遍历每一行酒店记录,生成对应年月序列后,将酒店基础信息与日期序列合并为临时DataFrame,最终拼接所有结果:
import pandas as pd # 原始数据 data = [['Oceanside', 'Puerto Rico', '2023-05-01', '2023-07-31'], ['Lakeside', 'Michigan', '2023-06-01', '2023-07-31'], ['Mountaintop', 'Colorado', '2023-04-01', '2023-07-31'], ['Desert', 'Arizona', '2023-05-01', '2023-08-30'], ['Countryside', 'Tennessee', '2023-02-01', '2023-03-31']] # 构建DataFrame并转换日期格式 df = pd.DataFrame(data, columns=['Hotel Name', 'Location', 'Availability Start Date', 'Availability End Date']) df['Start_Date'] = pd.to_datetime(df['Availability Start Date']) df['End_Date'] = pd.to_datetime(df['Availability End Date']) # 生成带酒店信息的拆分数据 result_dfs = [] for row in df.itertuples(): # 生成每月初的日期序列 month_dates = pd.date_range(row.Start_Date, row.End_Date, freq="MS") # 创建包含酒店信息和日期的临时DataFrame temp_df = pd.DataFrame({ 'Hotel Name': row._1, 'Location': row._2, 'Available Month': month_dates }) result_dfs.append(temp_df) # 合并所有结果并重置索引 final_df = pd.concat(result_dfs, ignore_index=True) # 可选:将日期格式化为年月字符串(如'2023-05') final_df['Available Month'] = final_df['Available Month'].dt.strftime('%Y-%m') print(final_df)
方法2:使用explode高效拆分(推荐)
通过apply为每行生成日期范围列表,再用explode将列表拆分为多行,这种方法性能更优,适合大数据量场景:
import pandas as pd # 原始数据 data = [['Oceanside', 'Puerto Rico', '2023-05-01', '2023-07-31'], ['Lakeside', 'Michigan', '2023-06-01', '2023-07-31'], ['Mountaintop', 'Colorado', '2023-04-01', '2023-07-31'], ['Desert', 'Arizona', '2023-05-01', '2023-08-30'], ['Countryside', 'Tennessee', '2023-02-01', '2023-03-31']] # 构建DataFrame并转换日期格式 df = pd.DataFrame(data, columns=['Hotel Name', 'Location', 'Availability Start Date', 'Availability End Date']) df['Start_Date'] = pd.to_datetime(df['Availability Start Date']) df['End_Date'] = pd.to_datetime(df['Availability End Date']) # 为每行生成可用年月的日期列表 df['Available Months'] = df.apply(lambda x: pd.date_range(x['Start_Date'], x['End_Date'], freq='MS'), axis=1) # 拆分列表为多行并清理列 final_df = df.explode('Available Months').reset_index(drop=True) final_df = final_df[['Hotel Name', 'Location', 'Available Months']] # 可选:格式化日期为年月字符串 final_df['Available Months'] = final_df['Available Months'].dt.strftime('%Y-%m') print(final_df)
两种方法最终输出的结果都会包含每行酒店对应每个可用年月的记录,示例片段:
Hotel Name Location Available Month 0 Oceanside Puerto Rico 2023-05 1 Oceanside Puerto Rico 2023-06 2 Oceanside Puerto Rico 2023-07 3 Lakeside Michigan 2023-06 4 Lakeside Michigan 2023-07 ...
内容的提问来源于stack exchange,提问作者the_zeef
相关产品推荐
相关产品推荐

