DataFrame时间处理
示例数据
将字符串列转化成时间序列
有时从 csv 或 xlsx 文件中读取的时间,是字符串(Object
)类型,这时就需要将其转化成 datetime
类型,方便后续对时间的处理。
pd.to_datetime(df['datetime']) 复制代码
将时间列作为索引
对于大部分时间序列数据,我们都可以将该列作为索引,来最大的利用时间。这里 drop=False
选择不删除 datetime
列。
df.set_index('datetime', drop=False) 复制代码
通过索引获取 1月 的数据,这里显示前五行。
df.loc['2021-1'].head() 复制代码
通过索引获取 1~3月 的数据。
df.loc['2021-1':'2021-3'].info() 复制代码
获取时间的各个属性
这里给出一般需求中可能会用到的属性,同时给出各个方法的实例。
常见属性 | 描述 |
date |
获取日期 |
time |
获取时间 |
year |
获取年份 |
month |
获取月份 |
day |
获取天 |
hour |
获取小时 |
minute |
获取分钟 |
second |
获取秒 |
dayofyear |
数据处于一年中的第几天 |
weekofyear |
数据处于一年中的第几周(新版使用 isocalendar().week ) |
weekday |
数据处于一周中的第几天(数字 周一为0) |
day_name() |
数据处于一周中的第几天(英文 Monday) |
quarter |
数据处于一年中的第几季度 |
is_leap_year |
是否为闰年 |
这里随便选第 100 行的日期做示例,各个属性的结果均以注释的形式展示。
df['datetime'].dt.date[100] # datetime.date(2021, 4, 11) df['datetime'].dt.time[100] # datetime.time(11, 50, 58, 995000) df['datetime'].dt.year[100] # 2021 df['datetime'].dt.month[100] # 4 df['datetime'].dt.day[100] # 11 df['datetime'].dt.hour[100] # 11 df['datetime'].dt.minute[100] # 50 df['datetime'].dt.second[100] # 58 df['datetime'].dt.dayofyear[100] # 101 df['datetime'].dt.isocalendar().week[100] # 14 df['datetime'].dt.weekday[100] # 6 df['datetime'].dt.day_name()[100] # 'Sunday' df['datetime'].dt.quarter[100] # 2 df['datetime'].dt.is_leap_year[100] # False 复制代码
重采样 resample()
重采样分为 降采样 和 升采样 两种。
降采样指的是采样的时间频率低于原时间序列的时间频率,同时来讲就是一个聚合操作。看示例,下面获取各季度的 count
列平均值。Q
代表 quarter
表示按季度采样。
df.resample('Q',on='datetime')["count"].mean() 复制代码
注意:此时的输出的最大时间为06-30, 并不是实际数据中的 05-31。 但是并不影响计算。
升采样与降采样相反,指的是采样的时间频率高于原时间序列的时间频率,相当于获取更细纬度的时间数据,但这样往往会造成数据中存在大量空值,实际用的不多,这里就不展开讲解了。