1. 从零准备:选对Pandas版本,建好时间索引
1.1 版本与安装的坑,我帮你趟过了
拿到“用Pandas处理时间序列数据”这个需求,很多人第一反应是打开PyCharm直接写import pandas as pd,结果一运行就报ModuleNotFoundError。这问题太常见了,热搜里“pycharm怎么安装pandas包”的搜索量从没下来过。这里我只说最稳的两种方式:
第一种,在PyCharm底部Terminal里直接执行:
bash复制pip install pandas
如果项目用了虚拟环境,记得先确认Terminal里显示的路径带venv字样,否则装到了全局Python里,项目照样找不到。
第二种,用PyCharm的Settings → Project → Python Interpreter → 加号按钮搜索pandas安装,适合不想敲命令的新手。
关键问题是版本适配。很多用户用的是Python 3.10,这时候装新版本pandas完全没问题。但如果你还在用Python 3.8或更老的3.7,就不能盲目装最新版了。我用一张表说明:
| Python版本 | 推荐Pandas版本 | 备注 |
|---|---|---|
| 3.7 | pandas 1.3.x | 再老版本对3.7支持不友好 |
| 3.8 | pandas 1.5.x | 稳定,用的最多 |
| 3.9 | pandas 2.0.x | 兼容性较好 |
| 3.10 | pandas 2.0.x及以上 | 目前主流组合 |
| 3.11+ | pandas 2.1.x及以上 | 新老API差异需注意 |
注意:Pandas 2.0有一个比较大的变化,就是
copy-on-write机制的引入。早期版本里,df[column] = ...可能会触发链式赋值的警告,到了2.1之后这种操作变得更加严格。如果你是从老版本升上来的,处理好这个区别,基本不会有什么大坑。
如果你需要读取Excel文件,别忘了装openpyxl引擎,这是热搜词里“pip install pandas openpyxl”的原因所在。只装pandas不装openpyxl,pd.read_excel()会直接报错。
bash复制pip install pandas openpyxl
1.2 一步到位:把普通列变成时间索引
时间序列数据处理的第一步,永远是让Pandas知道“哪一列是时间”。我见过太多人拿着一个带日期列的DataFrame就开始算滚动均值,然后发现结果完全不对,原因就是Pandas根本没把日期当日期处理。
最简单稳妥的转换方式:
python复制import pandas as pd
df = pd.read_csv('sales.csv')
print(df.dtypes)
# 输出: date object → 这说明date还是字符串,不是时间类型
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
print(df.index)
# 输出: DatetimeIndex(['2024-01-01', '2024-01-02', ...], dtype='datetime64[ns]', name='date', freq=None)
这背后有两件事同时发生了:第一,pd.to_datetime()把字符串列转成了datetime64[ns]类型;第二,set_index()把这一列提升为DataFrame的行索引,于是这个DataFrame就成了真正意义上的时间序列数据。
pd.to_datetime()的解析能力很强,像2024/01/01、20240101、Jan 1, 2024这些格式基本都能自动识别。不过如果你的数据源格式特殊,比如“2024年1月”这种中文格式,建议手动指定格式参数,否则Pandas可能识别不出:
python复制df['date'] = pd.to_datetime(df['date'], format='%Y年%m月')
1.3 从Excel读时间序列,别踩多级表头的坑
热搜词里“pandas读取excel文件”和“pandas数据类型转换”经常一起出现,因为这俩在真实业务场景里就是配套的。读取Excel时间序列数据时,最常见的坑是:Excel单元格里看着是日期,pd.read_excel读进来却变成了一串数字,或者读成了字符串。
这是因为Excel内部存储日期时用的是序列号,读入时如果没有正确识别单元格格式,就会
