基础入门
把清理后的行情表按日期重新排序并重置索引,确保后续滚动计算和时间统计建立在可靠顺序之上。
第 5 讲解决的是一个经常被低估、但后面会反复影响结果的问题:表的顺序和索引是不是已经整理干净。如果日期顺序乱了,收益率、均线和分组统计都可能看起来“能跑”,但实际含义已经偏掉。
学完这一讲后,你可以直接完成下面几件事:
前 4 讲里,你已经做过选列、筛行、加收益率、删空值。到了这一步,一个很现实的结果是:表的行顺序和原始索引很可能已经不再那么整齐。若你继续往下算均线和分组统计,却没有先把表整理好,后面的结果就会埋下解释风险。
尤其在金融数据里,时间顺序不是可有可无的美观问题,而是分析语义本身的一部分。第 5 讲就是在帮你把这件事明确下来。
print(clean_df.head())
print(clean_df.index)
第 5 讲开始前,你最好先看一眼当前索引和日期列,确认自己确实知道现在这张表长什么样。
这一讲最稳的顺序是先把日期列处理成可排序的类型,再排序,再重置索引,最后从头尾两端确认顺序已经理顺。
clean_df['date'] = pd.to_datetime(clean_df['date'], errors='coerce')
如果 date 仍是纯字符串,虽然有时也能看起来排对,但显式转成 datetime 会更稳,也更符合后面的时序处理习惯。
sorted_df = clean_df.sort_values('date')
print(sorted_df[['date', 'close']].head())
这一步的核心不是“看着更整齐”,而是确保后面的滚动计算和时间比较建立在可靠顺序上。
sorted_df = sorted_df.reset_index(drop=True)
print(sorted_df.index)
排序以后,旧索引往往已经不再有太大意义。重置索引能让这张工作表重新回到一种干净、连续、易于后续定位的状态。
print(sorted_df[['date', 'close']].head())
print(sorted_df[['date', 'close']].tail())
头尾都看一遍,比只看前几行更稳。因为你现在真正关心的是整张表的顺序,而不是某几行表面上看起来没问题。
顺序有没有真的整理好,不能只看表面“像不像排过”,而要看日期类型、索引状态和时间先后关系这三件事是否同时成立。
assert str(sorted_df['date'].dtype).startswith('datetime64')
assert list(sorted_df.index[:3]) == [0, 1, 2]
assert sorted_df['date'].is_monotonic_increasing
assert len(sorted_df) > 0
这两个动作经常连着出现,是因为它们解决的是同一类问题:前者整理时间顺序,后者整理行号视角。缺一个,后面读表时都可能别扭。
可以运行,但调试时会有点乱。因为表的视觉顺序已经变了,原索引却还保留着旧位置,容易让你误判行号。
因为显式转成 datetime 后,后续按月份统计、时间筛选和滚动处理会更稳,也更不容易被格式细节绊住。
建议仍然做一次确认。第 5 讲的价值,不只是“修错”,也是“明确顺序已经正确”。
不会。这里只是把旧索引换成一组新的连续编号,表里的实际列和值不会消失。
date 设成索引,第 5 讲先把列顺序理清即可。import pandas as pd
def sort_by_date(df: pd.DataFrame) -> pd.DataFrame:
out = df.copy()
out['date'] = pd.to_datetime(out['date'], errors='coerce')
out = out.sort_values('date').reset_index(drop=True)
return out
sorted_df = sort_by_date(clean_df)
print(sorted_df.head())
第 5 讲里还有一个很实用的小动作,就是排序完成后,不只看 head(),还可以手动抽查首尾各一行:
print(sorted_df.loc[0, 'date'])
print(sorted_df.loc[len(sorted_df) - 1, 'date'])
如果你能明确看见第一行是更早日期、最后一行是更晚日期,那么你对“顺序已经正确”这件事会更有把握。这类小抽查在后面做滚动计算前非常值钱。
均线、月度统计、回测准备,这些操作看起来各不相同,但它们都共享一个前提:时间顺序可信。第 5 讲的价值就在这里。它不是一讲“整理格式”的杂事,而是在为第 6 讲和第 7 讲准备稳定的时序地基。
如果你现在已经能把 clean_df 按日期排好,并把索引整理成连续编号,那第 5 讲就算完成。
本讲是《pandas金融数据入门短课》的第 5/8 讲,当前主题是《排序并重置索引》。
上一讲:第 4 讲《处理缺失值》。
下一讲:第 6 讲《计算5日和10日均线》。
后续安排:第 7 讲《按月份统计平均收益》;第 8 讲《导出清洗后的行情表》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。