重要的数据形式时间序列

datetime以毫秒形式存储日期和时间

  1. now = datetime.now()
  2. now
  3. datetime.datetime(2018, 12, 18, 14, 18, 27, 693445)
  4. #now是一个时间对象
  5. now.year,now.month,now.day
  6. (2018, 12, 18)
  7. delta = datetime(2011,1,7)-datetime(2008,6,24,8,15)
  8. delta
  9. datetime.timedelta(days=926, seconds=56700)
  10. delta.days
  11. 926
  12. timedelta表示时间差,默认差值是天数
  13. start = datetime(2011,7,7)
  14. start + timedelta(12)
  15. datetime.datetime(2011, 7, 19, 0, 0)
  16. start - 2*timedelta(12)
  17. datetime.datetime(2011, 6, 13, 0, 0)

字符串和datetime的相互转化

  1. stamp = datetime(2011, 1, 3)
  2. str(stamp)
  3. '2011-01-03 00:00:00'
  4. # strftime将时间变为字符串
  5. stamp.strftime('%Y-%m-%d')
  6. '2011-01-03'
  7. # strptime将字符串转回去
  8. value = '2011-01-03'
  9. datetime.strptime(value,'%Y-%m-%d')
  10. datetime.datetime(2011, 1, 3, 0, 0)
  11. datestrs = ['7/6/2011','8/6/2011']
  12. [datetime.strptime(x,'%m/%d/%Y') for x in datestrs]
  13. [datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]

每次定义格式是很麻烦的事情,尤其是对于一些常见的日期格式,在这个情况下,你可以用dateutil这个的第三方包parser.parse方法

这个包几乎可以解析人类能够理解的日期表示形式

  1. from dateutil.parser import parse
  2. parse('2011-01-03')
  3. datetime.datetime(2011, 1, 3, 0, 0)
  4. parse('Jan 31,1997 10:45 PM')
  5. datetime.datetime(2018, 1, 31, 22, 45)
  6. # 国际通用的格式中,日通常出现在月的前面,传入dayfirst=True即可解决这个问题
  7. parse('6/12/2011',dayfirst=True)
  8. datetime.datetime(2011, 12, 6, 0, 0)
  9. # to_datetime方法可以解析很多种不同的日期表示形式
  10. datestrs
  11. ['7/6/2011', '8/6/2011']
  12. pd.to_datetime(datestrs)
  13. DatetimeIndex(['2011-07-06', '2011-08-06'], dtype='datetime64[ns]', freq=None)
  14. # 它还可以处理缺失值(None,空字符串),NaT是时间戳中的缺失值
  15. idx = pd.to_datetime(datestrs+[None])
  16. idx
  17. DatetimeIndex(['2011-07-06', '2011-08-06', 'NaT'], dtype='datetime64[ns]', freq=None)
  18. pd.isnull(idx)
  19. array([False, False, True])

时间序列基础

  1. from datetime import datetime
  2. # pandas 最基本的时间序列类型就是以时间戳为索引
  3. dates =[datetime(2011,1,2),datetime(2011,1,5),datetime(2011,1,7),
  4. datetime(2011,1,8),datetime(2011,1,10),datetime(2011,1,12)]
  5. ts = pd.Series([1,2,3,4,5,6],index=dates)
  6. ts
  7. 2011-01-02 1
  8. 2011-01-05 2
  9. 2011-01-07 3
  10. 2011-01-08 4
  11. 2011-01-10 5
  12. 2011-01-12 6
  13. dtype: int64
  14. ts + ts[::2]
  15. 2011-01-02 2.0
  16. 2011-01-05 NaN
  17. 2011-01-07 6.0
  18. 2011-01-08 NaN
  19. 2011-01-10 10.0
  20. 2011-01-12 NaN
  21. dtype: float64

时间的索引、选取、子集构造

  1. # 对于较长的时间序列,只需传入'年'或'年月'即可轻松选取数据的切片
  2. import numpy as np
  3. #periods这个参数的意思,我测试的意思是,你有多少数据,他会让日期随着增加多少。和前面的randn的随机数量对应
  4. longer_ts = pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000))
  5. longer_ts
  6. 2000-01-01 1.134719
  7. 2000-01-02 0.135780
  8. 2000-01-03 0.678652
  9. 2000-01-04 -0.751968
  10. 2000-01-05 0.429753
  11. 2000-01-06 1.107126
  12. 2000-01-07 -0.235910
  13. 2000-01-08 1.119085
  14. 2000-01-09 -0.150530
  15. 2000-01-10 0.831567
  16. 2000-01-11 0.525492
  17. 2000-01-12 1.369756
  18. 2000-01-13 -1.353343
  19. 2000-01-14 0.748277
  20. 2000-01-15 0.292153
  21. 2000-01-16 -0.782864
  22. 2000-01-17 1.698936
  23. 2000-01-18 -1.355965
  24. 2000-01-19 -0.562581
  25. 2000-01-20 -1.333895
  26. 2000-01-21 -0.679781
  27. 2000-01-22 0.568681
  28. 2000-01-23 -0.440312
  29. 2000-01-24 0.045437
  30. 2000-01-25 1.589143
  31. 2000-01-26 0.284029
  32. 2000-01-27 0.597105
  33. 2000-01-28 0.585111
  34. 2000-01-29 -1.011877
  35. 2000-01-30 1.594290
  36. ...
  37. 2002-08-28 -0.052543
  38. 2002-08-29 1.233685
  39. 2002-08-30 0.522945
  40. 2002-08-31 1.145214
  41. 2002-09-01 0.434717
  42. 2002-09-02 0.346381
  43. 2002-09-03 -0.286138
  44. 2002-09-04 0.300973
  45. 2002-09-05 0.220466
  46. 2002-09-06 0.991901
  47. 2002-09-07 -0.194287
  48. 2002-09-08 0.498222
  49. 2002-09-09 -0.760105
  50. 2002-09-10 -0.230607
  51. 2002-09-11 0.464191
  52. 2002-09-12 -0.707616
  53. 2002-09-13 -0.309575
  54. 2002-09-14 2.273895
  55. 2002-09-15 -0.640137
  56. 2002-09-16 -0.416139
  57. 2002-09-17 0.898827
  58. 2002-09-18 0.316116
  59. 2002-09-19 -0.067657
  60. 2002-09-20 -1.296407
  61. 2002-09-21 1.228108
  62. 2002-09-22 0.227808
  63. 2002-09-23 -0.550351
  64. 2002-09-24 -0.378321
  65. 2002-09-25 -0.170426
  66. 2002-09-26 -0.397266
  67. Freq: D, Length: 1000, dtype: float64
  68. # 直接输入年份,可以取出这一年的
  69. longer_ts['2001']
  70. 2001-01-01 0.698442
  71. 2001-01-02 1.289272
  72. 2001-01-03 -0.644030
  73. 2001-01-04 2.075233
  74. 2001-01-05 -0.815118
  75. 2001-01-06 -0.693868
  76. 2001-01-07 0.599281
  77. 2001-01-08 0.443403
  78. 2001-01-09 1.877780
  79. 2001-01-10 -0.764040
  80. 2001-01-11 0.451113
  81. 2001-01-12 -1.426837
  82. 2001-01-13 1.005724
  83. 2001-01-14 -1.965532
  84. 2001-01-15 0.052981
  85. 2001-01-16 -0.367127
  86. 2001-01-17 2.841093
  87. 2001-01-18 0.451022
  88. 2001-01-19 -0.826358
  89. 2001-01-20 0.241916
  90. 2001-01-21 2.213636
  91. 2001-01-22 -0.870844
  92. 2001-01-23 -0.626682
  93. 2001-01-24 -1.516729
  94. 2001-01-25 0.045325
  95. 2001-01-26 -1.106228
  96. 2001-01-27 0.681209
  97. 2001-01-28 1.833933
  98. 2001-01-29 -1.502188
  99. 2001-01-30 -1.162823
  100. ...
  101. 2001-12-02 0.903314
  102. 2001-12-03 1.338822
  103. 2001-12-04 1.326302
  104. 2001-12-05 0.964913
  105. 2001-12-06 -0.165172
  106. 2001-12-07 -0.690804
  107. 2001-12-08 0.381124
  108. 2001-12-09 2.526006
  109. 2001-12-10 -1.127983
  110. 2001-12-11 -1.162128
  111. 2001-12-12 0.461497
  112. 2001-12-13 -0.830332
  113. 2001-12-14 0.379069
  114. 2001-12-15 -0.800934
  115. 2001-12-16 1.524858
  116. 2001-12-17 0.749656
  117. 2001-12-18 0.922253
  118. 2001-12-19 -1.220435
  119. 2001-12-20 0.513252
  120. 2001-12-21 2.233032
  121. 2001-12-22 0.151856
  122. 2001-12-23 -0.481607
  123. 2001-12-24 0.737862
  124. 2001-12-25 -0.637651
  125. 2001-12-26 0.163501
  126. 2001-12-27 -0.720798
  127. 2001-12-28 0.029192
  128. 2001-12-29 -0.773972
  129. 2001-12-30 -2.377855
  130. 2001-12-31 0.086702
  131. Freq: D, Length: 365, dtype: float64
  132. longer_ts['2001-07']
  133. 2001-07-01 -0.868169
  134. 2001-07-02 1.109987
  135. 2001-07-03 -0.889585
  136. 2001-07-04 -0.568596
  137. 2001-07-05 0.749743
  138. 2001-07-06 0.019171
  139. 2001-07-07 -0.348141
  140. 2001-07-08 -0.222702
  141. 2001-07-09 0.294682
  142. 2001-07-10 -1.780858
  143. 2001-07-11 1.166257
  144. 2001-07-12 -0.167143
  145. 2001-07-13 -0.424275
  146. 2001-07-14 1.393253
  147. 2001-07-15 -1.485840
  148. 2001-07-16 0.980488
  149. 2001-07-17 1.018981
  150. 2001-07-18 0.907556
  151. 2001-07-19 0.105748
  152. 2001-07-20 -0.201183
  153. 2001-07-21 0.867441
  154. 2001-07-22 -0.951957
  155. 2001-07-23 -0.716637
  156. 2001-07-24 -0.995653
  157. 2001-07-25 0.439383
  158. 2001-07-26 -0.927410
  159. 2001-07-27 -1.997120
  160. 2001-07-28 -1.022692
  161. 2001-07-29 0.179568
  162. 2001-07-30 0.586362
  163. 2001-07-31 0.057300
  164. Freq: D, dtype: float64
  165. ts
  166. 2011-01-02 1
  167. 2011-01-05 2
  168. 2011-01-07 3
  169. 2011-01-08 4
  170. 2011-01-10 5
  171. 2011-01-12 6
  172. dtype: int64
  173. # 切片取数
  174. ts[datetime(2011,1,7):]
  175. 2011-01-07 3
  176. 2011-01-08 4
  177. 2011-01-10 5
  178. 2011-01-12 6
  179. dtype: int64
  180. ts['01/09/2011':'01/11/2011']
  181. 2011-01-10 5
  182. dtype: int64
  183. dates = pd.date_range('1/1/2000',periods=100,freq='W-WED')
  184. dates
  185. DatetimeIndex(['2000-01-05', '2000-01-12', '2000-01-19', '2000-01-26',
  186. '2000-02-02', '2000-02-09', '2000-02-16', '2000-02-23',
  187. '2000-03-01', '2000-03-08', '2000-03-15', '2000-03-22',
  188. '2000-03-29', '2000-04-05', '2000-04-12', '2000-04-19',
  189. '2000-04-26', '2000-05-03', '2000-05-10', '2000-05-17',
  190. '2000-05-24', '2000-05-31', '2000-06-07', '2000-06-14',
  191. '2000-06-21', '2000-06-28', '2000-07-05', '2000-07-12',
  192. '2000-07-19', '2000-07-26', '2000-08-02', '2000-08-09',
  193. '2000-08-16', '2000-08-23', '2000-08-30', '2000-09-06',
  194. '2000-09-13', '2000-09-20', '2000-09-27', '2000-10-04',
  195. '2000-10-11', '2000-10-18', '2000-10-25', '2000-11-01',
  196. '2000-11-08', '2000-11-15', '2000-11-22', '2000-11-29',
  197. '2000-12-06', '2000-12-13', '2000-12-20', '2000-12-27',
  198. '2001-01-03', '2001-01-10', '2001-01-17', '2001-01-24',
  199. '2001-01-31', '2001-02-07', '2001-02-14', '2001-02-21',
  200. '2001-02-28', '2001-03-07', '2001-03-14', '2001-03-21',
  201. '2001-03-28', '2001-04-04', '2001-04-11', '2001-04-18',
  202. '2001-04-25', '2001-05-02', '2001-05-09', '2001-05-16',
  203. '2001-05-23', '2001-05-30', '2001-06-06', '2001-06-13',
  204. '2001-06-20', '2001-06-27', '2001-07-04', '2001-07-11',
  205. '2001-07-18', '2001-07-25', '2001-08-01', '2001-08-08',
  206. '2001-08-15', '2001-08-22', '2001-08-29', '2001-09-05',
  207. '2001-09-12', '2001-09-19', '2001-09-26', '2001-10-03',
  208. '2001-10-10', '2001-10-17', '2001-10-24', '2001-10-31',
  209. '2001-11-07', '2001-11-14', '2001-11-21', '2001-11-28'],
  210. dtype='datetime64[ns]', freq='W-WED')
  211. long_df = pd.DataFrame(np.random.randn(100,4),index=dates,columns=['Colorado','Texas','New York','Ohio'])
  212. long_df.loc['2001-05']
  213. Colorado Texas New York Ohio
  214. 2001-05-02 -1.380726 -0.411279 0.153217 1.494666
  215. 2001-05-09 2.554090 1.930090 -0.181046 0.866642
  216. 2001-05-16 1.068669 1.494460 -1.386345 0.839434
  217. 2001-05-23 0.988561 -1.986414 0.681924 0.939525
  218. 2001-05-30 0.349177 1.213020 0.432394 -0.223059

带有重复索引的时间序列

  1. dates = pd.DatetimeIndex(['1/1/2000','1/2/2000','1/2/2000','1/3/2000'])
  2. dyp_tus = pd.Series([1,2,3,4],index=dates)
  3. dyp_tus
  4. 2000-01-01 1
  5. 2000-01-02 2
  6. 2000-01-02 3
  7. 2000-01-03 4
  8. dtype: int64
  9. # 判断出来不是唯一,有重复时间,但是具体哪一行不好判断
  10. dyp_tus.index.is_unique
  11. False
  12. # 分组可以查看出是哪一行不是唯一索引
  13. grouped = dyp_tus.groupby(level=0)
  14. grouped.count()
  15. 2000-01-01 1
  16. 2000-01-02 2
  17. 2000-01-03 1
  18. dtype: int64

pandas中的时间序列基础的更多相关文章

  1. Python数据分析 之时间序列基础

    1. 时间序列基础 import numpy as np import pandas as pd np.random.seed(12345) import matplotlib.pyplot as p ...

  2. (数据科学学习手札99)掌握pandas中的时序数据分组运算

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用pandas分析处理时间序列数据 ...

  3. Spark与Pandas中DataFrame对比

      Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...

  4. Spark与Pandas中DataFrame对比(详细)

      Pandas Spark 工作方式 单机single machine tool,没有并行机制parallelism不支持Hadoop,处理大量数据有瓶颈 分布式并行计算框架,内建并行机制paral ...

  5. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

  6. pandas中的axis参数(看其他人的博客中产生的疑问点,用自己的话解析出来)

    axis有两个值:axis=0或者axis=1 看到很多资料都不太理解,把我个人理解说一下: 下面这张图,在很多资料中都看到了,我只能说先死记住 axis=0,代表跨行(注意看这张图的axis=0的箭 ...

  7. Python学习教程:Pandas中第二好用的函数

    从网上看到一篇好的文章是关于如何学习python数据分析的迫不及待想要分享给大家,大家也可以点链接看原博客.希望对大家的学习有帮助. 本次的Python学习教程是关于Python数据分析实战基础相关内 ...

  8. 小白学 Python 数据分析(6):Pandas (五)基础操作(2)数据选择

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  9. (数据科学学习手札97)掌握pandas中的transform

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 开门见山,在pandas中,transform是 ...

随机推荐

  1. select、poll、epoll之间的区别总结[转载]

    转载:https://www.cnblogs.com/Anker/p/3265058.html select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述 ...

  2. Windows10中使用Anaconda安装keras-gpu版本(遇到的坑)

    1.使用conda install tensorflow-gpu 2.使用pip install keras 这里使用pip安装而不是使用conda,原因是使用conda安装会默认安装cpu版本的te ...

  3. Tree Traversals Again

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...

  4. JeeCMS v7 SSRF导致任意文件写入

    前言: 学习大佬的思路. from先知社区:https://xz.aliyun.com/t/4809 00X1: 是/ueditor/getRemoteImage.jspx 接口 通过构造upfile ...

  5. Linux基础之常用命令整理(一)

    Linux 操作系统的安装 如今比较流线的linux操作系统 Centos Redhat  Fedora Ubuntu, 安装操作系统的提前是要有操作系统的镜像文件(.iso文件)并且必须为系统指定一 ...

  6. 对象名 'dbo.__MigrationHistory' 无效 错误解决

    // 在数据库上下文的构造方法里 public GewPeAppContext() : base(ConnectionStrings.GewPeAppConnectionString) { // 添加 ...

  7. 刘志梅201771010115.《面向对象程序设计(java)》第十五周学习总结

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 1.实验目的与要求 (1)一个JAR文件既可以包含类文件,也可以包含诸如图像和声音这些其他类型的文件. 创建一个新的JAR文件应 ...

  8. 在MyEclipse使用Git新建分支,并上传分支---图文教程

    1.选中项目,右键--->Team--->Switch To--->New Branch: 2.在弹出的窗口中,填写新建的分支名称,如下图 3.当前分支就会变成新建分支“test” ...

  9. 洛谷题解 CF807A 【Is it rated?】

    同步题解 题目 好吧,来说说思路: 1.先读入啦~(≧▽≦)/~啦啦啦 2.判断a[i]赛前赛后是否同分数,如果分数不同,则输出,return 0 . 3.如果同分数,则判断a[i]赛前(或赛后)是否 ...

  10. mysql集群搭建--韩国庆

    按照我给大家提供的步骤,一步一步来,你就能配好mysql集群环境 什么是mycat 简单的说,MyCAT就是: •一个彻底开源的,面向企业应用开发的“大数据库集群” •支持事务.ACID.可以替代My ...