如何用Pandas复制数据行并按周更新日期以完成周度数据上传?
需求说明
每周需上传与上周内容一致的数据集,仅将日期向后顺延一周。现有Pandas数据示例如下,目标是生成包含原日期及顺延一周后日期的数据集(复制原有数据并更新日期为原日期加7天)。
原数据示例
import pandas as pd data = {'Date': ['02/01/2023', '02/01/2023', '02/01/2023', '02/01/2023'] , 'Where': ['Spain', 'Spain', 'France', 'France'] , 'Metric': ['Holiday', 'Holiday', 'Expected', 'Expected'] , 'Value': [1, 0, 10, 5]} df = pd.DataFrame(data) print(df)
对应数据表:
| Date | Where | Metric | Value |
|---|---|---|---|
| 02/01/2023 | Spain | Holiday | 1 |
| 02/01/2023 | Spain | Holiday | 0 |
| 02/01/2023 | France | Expected | 10 |
| 02/01/2023 | France | Expected | 5 |
用户已编写部分日期处理代码,但未实现数据复制:
from datetime import timedelta, date def daterange(start_date, end_date): for n in range(0, int((end_date - start_date).days) + 1, 7): yield start_date + timedelta(n) start_dt = date(2023, 01, 02) # 需要动态获取现有数据中的最后日期 end_dt = date(2023, 01, 02)
完整解决方案
直接用Pandas的日期处理和数据拼接功能即可实现需求,步骤如下:
步骤1:转换日期列类型
先把原数据的Date列从字符串转为Pandas datetime类型,方便后续日期计算:
import pandas as pd # 加载原数据 data = {'Date': ['02/01/2023', '02/01/2023', '02/01/2023', '02/01/2023'] , 'Where': ['Spain', 'Spain', 'France', 'France'] , 'Metric': ['Holiday', 'Holiday', 'Expected', 'Expected'] , 'Value': [1, 0, 10, 5]} df = pd.DataFrame(data) # 转换为datetime格式(匹配原数据的MM/DD/YYYY格式) df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')
步骤2:复制数据并更新日期
复制原数据集,将复制后的Date列加上7天:
# 复制原数据 df_next_week = df.copy() # 日期顺延一周 df_next_week['Date'] = df_next_week['Date'] + pd.Timedelta(days=7)
步骤3:合并数据集
用pd.concat合并原数据和更新后的数据集,得到包含原日期和顺延一周日期的完整数据:
final_df = pd.concat([df, df_next_week], ignore_index=True)
步骤4:(可选)转回原日期字符串格式
如果需要将日期转回原有的MM/DD/YYYY字符串格式:
final_df['Date'] = final_df['Date'].dt.strftime('%m/%d/%Y')
最终结果
打印final_df会输出:
Date Where Metric Value 0 02/01/2023 Spain Holiday 1 1 02/01/2023 Spain Holiday 0 2 02/01/2023 France Expected 10 3 02/01/2023 France Expected 5 4 02/08/2023 Spain Holiday 1 5 02/08/2023 Spain Holiday 0 6 02/08/2023 France Expected 10 7 02/08/2023 France Expected 5
动态获取最后日期(适配多日期场景)
如果数据中包含多个日期,需要动态获取最后日期并生成多周顺延数据:
# 获取数据中的最新日期 last_date = df['Date'].max() # 生成原日期+顺延2周的日期列表(可按需调整周数) date_list = [last_date + pd.Timedelta(days=7*i) for i in range(3)] # 循环复制数据并合并 final_df = df.copy() for d in date_list[1:]: # 跳过原日期,只处理顺延的日期 temp_df = df.copy() temp_df['Date'] = d final_df = pd.concat([final_df, temp_df], ignore_index=True)
内容的提问来源于stack exchange,提问作者She632
相关产品推荐
相关产品推荐

