<jupyter_start><jupyter_text>CHAPTER 11 Time Series（时间序列）时间序列指能在任何能在时间上观测到的数据。很多时间序列是有固定频率（fixed frequency）的，意思是数据点会遵照某种规律定期出现，比如每15秒，每5分钟，或每个月。时间序列也可能是不规律的（irregular），没有一个固定的时间规律。如何参照时间序列数据取决于我们要做什么样的应用，我们可能会遇到下面这些：- Timestamps（时间戳），具体的某一个时刻- Fixed periods（固定的时期），比如2007年的一月，或者2010年整整一年- Intervals of time（时间间隔），通常有一个开始和结束的时间戳。Periods（时期）可能被看做是Intervals（间隔）的一种特殊形式。- Experiment or elapsed time（实验或经过的时间）；每一个时间戳都是看做是一个特定的开始时间（例如，在放入烤箱后，曲奇饼的直径在每一秒的变化程度）这一章主要涉及前三个类型。> pandas也支持基于timedeltas的index，本书不会对timedelta index做介绍，感兴趣的可以查看pandas的文档。 11.1 Date and Time Data Types and Tools（日期和时间数据类型及其工具）python有标准包用来表示时间和日期数据。datetime, time, calendar，这些模块经常被使用。datetime.datetime类型，或简单写为datetime，被广泛使用：<jupyter_code>import pandas as pd
from datetime import datetime
now = datetime.now()
now
now.year, now.month, now.day<jupyter_output><empty_output><jupyter_text>datetime能保存日期和时间到微妙级别。timedelta表示两个不同的datetime对象之间的时间上的不同：<jupyter_code>delta = datetime(2011, 1, 7) - datetime(2008, 6, 24, 8, 15)
delta
delta.days
delta.seconds<jupyter_output><empty_output><jupyter_text>我们可以在一个datetime对象上，添加或减少一个或多个timedelta，这样可以产生新的变化后的对象：<jupyter_code>from datetime import timedelta
start = datetime(2011, 1, 7)
start + timedelta(12)
start - 2 * timedelta(12)<jupyter_output><empty_output><jupyter_text>下表汇总了一些datetime模块中的数据类型：![](http://oydgk2hgw.bkt.clouddn.com/pydata-book/wqo6m.png) 1 Converting Between String and Datetime（字符串与时间的转换）我们可以对datetime对象，以及pandas的Timestamp对象进行格式化，这部分之后会介绍，使用str或strftime方法，传入一个特定的时间格式就能进行转换：<jupyter_code>stamp = datetime(2011, 1, 3)
str(stamp)
stamp.strftime('%Y-%m-%d')<jupyter_output><empty_output><jupyter_text>下表是关于日期时间类型的格式：![](http://oydgk2hgw.bkt.clouddn.com/pydata-book/r98dw.png)![](http://oydgk2hgw.bkt.clouddn.com/pydata-book/bc9e8.png)我们可以利用上面的format codes（格式码；时间日期格式）把字符串转换为日期，这要用到datetime.strptime:<jupyter_code>value = '2011-01-03'
datetime.strptime(value, '%Y-%m-%d')
datestrs = ['7/6/2011', '8/6/2011']
[datetime.strptime(x, '%m/%d/%Y') for x in datestrs]<jupyter_output><empty_output><jupyter_text>对于一个一直的时间格式，使用datetime.strptime来解析日期是很好的方法。但是，如果每次都要写格式的话很烦人，尤其是对于一些比较常见的格式。在这种情况下，我们可以使用第三方库dateutil中的parser.parse方法（这个库会在安装pandas的时候自动安装）：<jupyter_code>from dateutil.parser import parse
parse('2011-01-03')<jupyter_output><empty_output><jupyter_text>dateutil能够解析很多常见的时间表示格式：<jupyter_code>parse('Jan 31, 1997 10:45 PM')<jupyter_output><empty_output><jupyter_text>在国际上，日在月之前是很常见的（译者：美国是把月放在日前面的），所以我们可以设置dayfirst=True来指明最前面的是否是日：<jupyter_code>parse('6/12/2011', dayfirst=True)<jupyter_output><empty_output><jupyter_text>pandas通常可以用于处理由日期组成的数组，不论是否是DataFrame中的行索引或列。to_datetime方法能解析很多不同种类的日期表示。标准的日期格式，比如ISO 8601，能被快速解析：<jupyter_code>datestrs = ['2011-07-06 12:00:00', '2011-08-06 00:00:00']
pd.to_datetime(datestrs)<jupyter_output><empty_output><jupyter_text>还能处理一些应该被判断为缺失的值（比如None, 空字符串之类的）：<jupyter_code>idx = pd.to_datetime(datestrs + [None])
idx
idx[2]
pd.isnull(idx)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13034553540882654, 'fraction_numerical': 0.046527540198426275, 'mean_word_length': 14.229166666666666, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 42, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '204158', 'license': 'MIT', 'n_tokens_mistral': 1760, 'n_tokens_neox': 1738, 'n_words': 108, 'path': 'Chapter-11/11.1 Date and Time Data Types and Tools（日期和时间数据类型及其工具）.ipynb', 'repo_name': 'hu4012/pydata', 'size': '2923'}