Pandas:时序数据(上)
时间是一个比较特殊的事物,不像数字有具体的进制,可以做相关的计算。比如时间分秒时是60进制,时和天又是24进制,一周又有7天,一月又有28到31天不等,等等。这就给我们处理时间问题带来了麻烦。为了更好地表达现实世界中的时间,计算机设计者提出了一些概念来进行表达。
- 固定时间
- 这个非常简单,它是一个独立的时间,不在任何周期时,比如中午 13:30 睡觉,不代表你每半个小时就睡一次。其他的如,2020 年、农历四月十八、19世纪等等。
固定的时间有一定的属性,如所在年、月、日、毫秒等。
-
时间戳 timestamp
-
Unix时间戳(Unix timestamp),时间戳是指格林威治时间1970年01月01日00时00分00秒起至当下的总秒数。它是一个非常大的数字,一直以一秒的步长在增加。如:1591684854 代表北京时间 2020/6/9 14:40:54。那么 1970年 年以前的时间怎么表示呢?用负数,如-1591684957 代表1919/7/26 2:17:23。
-
时长时差 Time deltas
-
代表一个时间长度,但它没有指定的开始时间和结束时间,比如一首歌4分钟,你不管从什么时候开始,它都会占用4分钟。
-
格式化时间
-
由于原始时间数据可能是时间戳,也有可能是其他类型的数据,我们在使用时想按照一定的格式进行显示,就需要做格式化处理。如时间戳 1591684854 和 2020/6/9 14:40:54 转换为为 2020年06月09日 这样的中文格式。
-
周期时间
-
有开始、有结束,并且有时间单位周期的时间,比如从大学毕业后,我开始工作,每周一到周五去工作,持续到65岁退休,这个就是工作日周期。另如钟表,每半小时响一次,开始时间是我安装好它,结束时间是它坏掉的时候。
-
日期偏移 Date offsets
-
周期时间中有一个频率,一个频率是一个单位,日期偏移是基于这个频率,如一个周期的频率是小时,那偏移三个频率就是三小时。比如偏移一个工作周,这个工作周期是自己定义的。
-
时区
-
每个固定的时间都会有一个时区,一般为你电脑本地的时区,当然你根据需要可以进行调整。
-
工作日
-
在数据分析时,经常会与是否工作日相关,除了正常的周末,每个国家和地区节假日,甚至具体到一些公司都会有一些特定的作息,一般需要自己来指定这个工作日的周期。
-
时间转换
-
时间转换包括时间表达格式的转换,也会有一些时间计算,比如给一个时间,转为去年的当天、100天前的当天、转换为特定时区的时间等等。
时间序列(Time series)数据是非常重要的数据类型,在各个领域的研究中,都与时间相关,因此对于时间数据的处理就越来越重要。Pandas 提供了多种时间数据类型和处理方法。
1、固定时间
时间的表示
使用 python 的 datetime 库
import datetime
# 至少需要年月日
pd.Timestamp(datetime.datetime(2020, 6, 8))
# Timestamp('2020-06-08 00:00:00')
# 指定是时分秒
pd.Timestamp(datetime.datetime(2020, 6, 8, 16, 17, 18))
# Timestamp('2020-06-08 16:17:18')
创建时间点
pd.Timestamp() 是定义时间的主要函数,代替 python 中的 datetime.datetime 对象。
pd.Timestamp('2012-05-01')
# Timestamp('2012-05-01 00:00:00')
pd.Timestamp('2017-01-01T12')
# Timestamp('2017-01-01 12:00:00')
时间的属性
时间的方法
2、时长数据
Timedelta 是时间差异,也就是时长,以差异单位表示,例如 天,小时,分钟,秒。 它们可以是正数的也可以是负数的。也就是两个时间的距离长短,这在业务中会经常出现,比如体育比赛中短跑的时长,可能是正数,也可能是负数,正数代表时间多多少,负数代表时间少多少。
创建时间差
时长的加减
3、时间序列
时序索引
类型转换
- astype 是最简单的时间转换方法,它只能针对相对标准的时间格式,如:
s = pd.Series(['2016-01-31', '2016-02-29', '2016-03-31'])
s.astype('datetime64[ns]')
'''
0 2016-01-31
1 2016-02-29
2 2016-03-31
dtype: datetime64[ns]
'''
- Pandas 提供的 pd.to_datetime() 是识别转换时间的主要工具。
- 可以使用 pd.Timestamp() 进行转换:
pd.to_datetime('2010/11/12')
#Timestamp('2010-11-12 00:00:00')
pd.Timestamp('2010/11/12')
#Timestamp('2010-11-12 00:00:00')
- pd.DatetimeIndex 也可以转换:
pd.DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'])
#DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], dtype='datetime64[ns]', freq=None)
pd.DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], freq='infer')
#DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], dtype='datetime64[ns]', freq='2D')
按格式转换
对于有格式的数据,需要指定数据的格式:
时间访问器.dt
对于时间序列数据,可以使用 s.dt.xxx 的形式来访问它们的属性和调用它们的方法: