【学习】时间序列分析与处理【时间序列】

时间戳(timestamp),特定的时刻

固定时期(period),如2017年1月或2017年全年

时间间隔(interval), 由起始和结束时间戳表示

实验或过程时间,每个时间点都有相对于特定起始时间的一个度量

1、日期和时间数据类型及工具

from datetime import datetime

now = datetime.now()

now
Out[63]: datetime.datetime(2017, 9, 14, 17, 19, 5, 215000)

now.year, now.month, now.day
Out[64]: (2017, 9, 14)

datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差

delta = datetime(2017, 9, 14) - datetime(2016, 6, 24, 8, 15)
delta
delta.days
delta.seconds

Out[66]: datetime.timedelta(446, 56700)
delta.days
Out[67]: 446

delta.seconds
Out[69]: 56700

可以给datetime对象加上(或减去)一个或多个timedelta,这样会产生一个新对象

from datetime import timedelta

start = datetime(2017, 1, 7)

start + timedelta(12)
Out[72]: datetime.datetime(2017, 1, 19, 0, 0)

start - 2 * timedelta(12)
Out[73]: datetime.datetime(2016, 12, 14, 0, 0)

datetime模块中的数据类型

2、 字符串和datetime的相互转换

利用str 或 strftime方法, datetime对象和pandas 的 timestamp对象可以被格式化字符串

stamp = datetime(2017, 1, 3)

str(stamp)
Out[75]: '2017-01-03 00:00:00'

stamp
Out[76]: datetime.datetime(2017, 1, 3, 0, 0)

stamp.strftime('%Y - %m - %d')
Out[77]: '2017 - 01 - 03'

stamp.strftime('%Y-%m-%d')
Out[78]: '2017-01-03'
value = '2017-09-14'

datetime.strptime(value, '%Y-%m-%d')
Out[86]: datetime.datetime(2017, 9, 14, 0, 0)

datestrs = ['7/6/2017', '8/6/2017']

[datetime.strptime(x, '%m/%d/%Y') for x in datestrs]
Out[88]: [datetime.datetime(2017, 7, 6, 0, 0), datetime.datetime(2017, 8, 6, 0, 0)]

datetime.strptime是通过已知格式进行日期解析的最佳方式。但是是件很麻烦的事情,可以用dateutil这个第三方包中的parser.parse方法

from dateutil.parser import parse

parse('2017-09-14')
Out[90]: datetime.datetime(2017, 9, 14, 0, 0)

dateutil可以解析几乎所有人类能够理解的日期表示形式,但中文不行

parse('Jan 31, 2017 10:45 PM')
Out[91]: datetime.datetime(2017, 1, 31, 22, 45)

在国际通用的格式中,日通常出现在月的前面,传入dayfirst = True 即可解决这个问题

parse('9/12/2017',dayfirst = True)
Out[92]: datetime.datetime(2017, 12, 9, 0, 0)

用pandas中 to_datetime方法可以解析多种不同的日期表示形式,对标准日期格式解析非常快

datestrs
Out[93]: ['7/6/2017', '8/6/2017']

import pandas as pd

pd.to_datetime(datestrs)
Out[95]: DatetimeIndex(['2017-07-06', '2017-08-06'], dtype='datetime64[ns]', freq=None)

它还可以处理缺失值(None, 空字符串)

idx = pd.to_datetime(datestrs + [None])

idx
Out[97]: DatetimeIndex(['2017-07-06', '2017-08-06', 'NaT'], dtype='datetime64[ns]', freq=None)
idx[2]
Out[98]: NaT

pd.isnull(idx)
Out[99]: array([False, False,  True], dtype=bool)

NaT(Not a Time)是pandas中时间戳数据的NA值

注意:dateutil.parser是一个实用但不完美的工具。会把一些原本不是日期的字符串认作是日期

datetime的格式定义

datetime对象还有一些特定于当前环境的格式化选项

原文地址:https://www.cnblogs.com/yizhenfeng/p/7521933.html