如何用Python基于起止日期列插入DataFrame数据行?
解决方案:展开促销周期内的所有月份行
步骤说明
- 转换日期格式:将
start_date和end_date的YYYYMM数字格式转为datetime类型,便于生成连续月份序列。 - 生成月度序列:对每一行数据,生成从
start_date到end_date之间的所有月份(包含起止月)。 - 展开多行并保留属性:将生成的月度序列拆分为单独行,同时复制原行的
item、promotion_type、promotion_desc属性。 - 还原日期格式:将生成的
datetime月份转回YYYYMM数字格式,匹配期望输出。
完整代码实现
import pandas as pd # 原数据(修正拼写错误:promotin_type → promotion_type) sales_dict = {} sales_dict['item'] = ['100179K', '100086K'] sales_dict['start_date'] = [201703, 201801] sales_dict['end_date'] = [201707, 201802] sales_dict['promotion_type'] = [1, 0] sales_dict['promotion_desc'] = [0, 1] df = pd.DataFrame.from_dict(sales_dict) # 1. 转换日期列为datetime类型 df['start_date'] = pd.to_datetime(df['start_date'], format='%Y%m') df['end_date'] = pd.to_datetime(df['end_date'], format='%Y%m') # 2. 为每一行生成包含所有月份的列表 df['month_sequence'] = df.apply( lambda row: pd.date_range(start=row['start_date'], end=row['end_date'], freq='MS').tolist(), axis=1 ) # 3. 展开月度序列为多行,同时保留其他属性 expanded_df = df.explode('month_sequence').drop(columns=['start_date', 'end_date']) # 4. 将datetime月份转回YYYYMM数字格式,并重命名为start_date expanded_df['start_date'] = expanded_df['month_sequence'].dt.strftime('%Y%m').astype(int) expanded_df = expanded_df.drop(columns=['month_sequence'])[['item', 'start_date', 'promotion_type', 'promotion_desc']] print(expanded_df)
输出结果
item start_date promotion_type promotion_desc 0 100179K 201703 1 0 0 100179K 201704 1 0 0 100179K 201705 1 0 0 100179K 201706 1 0 0 100179K 201707 1 0 1 100086K 201801 0 1 1 100086K 201802 0 1
关键细节说明
pd.date_range(..., freq='MS'):MS表示每个月的第一天,确保生成的是每个月的起始日期,转换为YYYYMM时不会出错。explode():将列表类型的列拆分为多行,自动复制其他列的对应值,完美解决“一行转多行”的需求。- 修正了原数据中的列名拼写错误
promotin_type为promotion_type,避免后续操作报错。
内容的提问来源于stack exchange,提问作者JordanBH
相关产品推荐
相关产品推荐

