Pandas进阶拾 时序数据
pandas进阶系列根据datawhale远昊大佬的joyful pandas教程写一些自己的心得和补充,本文部分引用了原教程,并参考了pandas官网
另注:本文是对joyful pandas教程的延伸,完整理解需先阅读joyful pandas教程第拾章
练习
Ex1:太阳辐射数据集
现有一份关于太阳辐射的数据集:
- 将
Datetime, Time
合并为一个时间列Datetime
,同时把它作为索引后排序。 - 每条记录时间的间隔显然并不一致,请解决如下问题:
- 找出间隔时间的前三个最大值所对应的三组时间戳。
- 是否存在一个大致的范围,使得绝大多数的间隔时间都落在这个区间中?如果存在,请对此范围内的样本间隔秒数画出柱状图,设置
bins=50
。
- 求如下指标对应的
Series
:
- 温度与辐射量的6小时滑动相关系数
- 以三点、九点、十五点、二十一点为分割,该观测所在时间区间的温度均值序列
- 每个观测6小时前的辐射量(一般而言不会恰好取到,此时取最近时间戳对应的辐射量)
import numpy as np
import pandas as pd
df = pd.read_csv('../data/solar.csv', usecols=['Data','Time','Radiation','Temperature'])
df.head(3)
Data | Time | Radiation | Temperature | |
---|---|---|---|---|
0 | 9/29/2016 12:00:00 AM | 23:55:26 | 1.21 | 48 |
1 | 9/29/2016 12:00:00 AM | 23:50:23 | 1.21 | 48 |
2 | 9/29/2016 12:00:00 AM | 23:45:26 | 1.23 | 48 |
第一问 将Datetime, Time
合并为一个时间列Datetime
,同时把它作为索引后排序。
思路:需要取出两个目标列中的日期和时间,因此先转换为datetime64[ns]
格式,然后就有了日期列和时间列,将其看作字符串并合并
df2 = df.copy()
date = df2.Data.astype('datetime64[ns]').dt.date.astype('string')
time = df2.Time.astype('datetime64[ns]').dt.time.astype('string')
df2['Datetime'] = (date + ' ' + time).astype('datetime64[ns]')
df2.drop(columns=['Data', 'Time'], inplace=True)
df2 = df2.set_index('Datetime').sort_index()
df2.head(3)
Radiation | Temperature | |
---|---|---|
Datetime | ||
2016-09-01 00:00:08 | 2.58 | 51 |
2016-09-01 00:05:10 | 2.83 | 51 |
2016-09-01 00:20:06 | 2.16 | 51 |
第二问 求解前三组间隔时间最大的所对应的时间戳
思路:首先将Datetime
用diff
滑窗求日期差值(上一问已完成排序),可以看出,求出的结果(日期差值)的索引是该项与前一项的差值,因此第一项的值为空,紧接着求最大的三个差值对应的索引,这个索引对应的时间戳便是三组时间戳的右临界值,左临界值就是索引-1,也就是前一项的时间戳。
df3 = df2.reset_index()
right_index = df3['Datetime'].diff(1).sort_values(ascending=False)[:3].index
left_index = right_index-1
res = []
for i,j in zip(df3.loc[left_index]['Datetime'], df3.loc[right_index]['Datetime']):
res.append((i, j))
for x