如何将DataFrame顶部多行移至底部并替换为新日期
将DataFrame顶部多行移至底部并更新日期
需要将DataFrame顶部4行移至底部,并更新这些行的date列,使其与原DataFrame的最后一行日期保持连续(例如原最后一行是2022-04-03,移动后的行日期依次为2022-04-04、2022-04-05等)。
修改后的完整代码
import pandas as pd import numpy as np from datetime import date, timedelta from datetime import datetime # 读取Excel文件 names = ['date', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48] df = pd.read_excel('Test.xlsx', header=None, names=names) # 统一转换date列为datetime类型 df['date'] = pd.to_datetime(df['date']) # 获取当前起始日期 a = df['date'].min() # 输入新起始日期 b = input("Enter start date as dd-mm-YYYY") b = datetime.strptime(b, "%d-%m-%Y") # 计算星期几差值(保留原逻辑) b2 = b.weekday() a2 = a.weekday() c = (b2 - a2) print(c) # --- 核心逻辑 --- # 定义要移动的行数(这里为4行) rows_to_move = 4 # 拆分DataFrame:剩余部分 + 要移动的顶部4行 df_remaining = df.iloc[rows_to_move:] df_moved = df.iloc[:rows_to_move].copy() # 生成移动行的连续日期:从原数据最后一天的下一天开始 last_date = df_remaining['date'].max() new_dates = [last_date + timedelta(days=i+1) for i in range(rows_to_move)] df_moved['date'] = new_dates # 合并两部分并重置索引,保证索引连续 df = pd.concat([df_remaining, df_moved], ignore_index=True) # 输出结果 print(df)
关键改动说明
- 批量移动行:用
iloc直接拆分和拼接DataFrame,替代原循环单行移动的方式,效率更高且逻辑清晰。 - 生成连续日期:基于原数据的最后日期,通过
timedelta为移动的每行生成递增的连续日期,确保日期无缝衔接。 - 重置索引:拼接时启用
ignore_index=True,让新DataFrame的索引连续递增,匹配期望输出的格式。 - 统一日期类型:提前将
date列转换为datetime类型,避免后续操作中出现类型不兼容的错误。
运行上述代码后,即可得到与期望一致的输出:顶部4行移至底部,且日期从原数据的最后一天之后开始连续。
内容的提问来源于stack exchange,提问作者Oatnuj
相关产品推荐
相关产品推荐

