当前位置: 首页 > news >正文

pandas教程:Date and Time Data Types and Tools 日期和时间数据类型及其工具

文章目录

  • Chapter 11 Time Series(时间序列)
  • 11.1 Date and Time Data Types and Tools(日期和时间数据类型及其工具)
  • 1 Converting Between String and Datetime(字符串与时间的转换)

Chapter 11 Time Series(时间序列)

时间序列指能在任何能在时间上观测到的数据。很多时间序列是有固定频率(fixed frequency)的,意思是数据点会遵照某种规律定期出现,比如每15秒,每5分钟,或每个月。时间序列也可能是不规律的(irregular),没有一个固定的时间规律。如何参照时间序列数据取决于我们要做什么样的应用,我们可能会遇到下面这些:

  • Timestamps(时间戳),具体的某一个时刻
  • Fixed periods(固定的时期),比如2007年的一月,或者2010年整整一年
  • Intervals of time(时间间隔),通常有一个开始和结束的时间戳。Periods(时期)可能被看做是Intervals(间隔)的一种特殊形式。
  • Experiment or elapsed time(实验或经过的时间);每一个时间戳都是看做是一个特定的开始时间(例如,在放入烤箱后,曲奇饼的直径在每一秒的变化程度)

这一章主要涉及前三个类型。

pandas也支持基于timedeltasindex,本书不会对timedelta index做介绍,感兴趣的可以查看pandas的文档。

11.1 Date and Time Data Types and Tools(日期和时间数据类型及其工具)

python有标准包用来表示时间和日期数据。datetime, time, calendar,这些模块经常被使用。datetime.datetime类型,或简单写为datetime,被广泛使用:

import pandas as pd
from datetime import datetime
now = datetime.now()
now
datetime.datetime(2017, 12, 1, 12, 12, 0, 375896)
now.year, now.month, now.day
(2017, 12, 1)

datetime能保存日期和时间到微妙级别。timedelta表示两个不同的datetime对象之间的时间上的不同:

delta = datetime(2011, 1, 7) - datetime(2008, 6, 24, 8, 15)
delta
datetime.timedelta(926, 56700)
delta.days
926
delta.seconds
56700

我们可以在一个datetime对象上,添加或减少一个或多个timedelta,这样可以产生新的变化后的对象:

from datetime import timedelta
start = datetime(2011, 1, 7)
start + timedelta(12)
datetime.datetime(2011, 1, 19, 0, 0)
start - 2 * timedelta(12)
datetime.datetime(2010, 12, 14, 0, 0)

1 Converting Between String and Datetime(字符串与时间的转换)

我们可以对datetime对象,以及pandasTimestamp对象进行格式化,这部分之后会介绍,使用strstrftime方法,传入一个特定的时间格式就能进行转换:

stamp = datetime(2011, 1, 3)
str(stamp)
'2011-01-03 00:00:00'
stamp.strftime('%Y-%m-%d')
'2011-01-03'

我们可以利用上面的format codes(格式码;时间日期格式)把字符串转换为日期,这要用到datetime.strptime:

value = '2011-01-03'
datetime.strptime(value, '%Y-%m-%d')
datetime.datetime(2011, 1, 3, 0, 0)
datestrs = ['7/6/2011', '8/6/2011']
[datetime.strptime(x, '%m/%d/%Y') for x in datestrs]
[datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]

对于一个一直的时间格式,使用datetime.strptime来解析日期是很好的方法。但是,如果每次都要写格式的话很烦人,尤其是对于一些比较常见的格式。在这种情况下,我们可以使用第三方库dateutil中的parser.parse方法(这个库会在安装pandas的时候自动安装):

from dateutil.parser import parse
parse('2011-01-03')
datetime.datetime(2011, 1, 3, 0, 0)

dateutil能够解析很多常见的时间表示格式:

parse('Jan 31, 1997 10:45 PM')
datetime.datetime(1997, 1, 31, 22, 45)

在国际上,日在月之前是很常见的(译者:美国是把月放在日前面的),所以我们可以设置dayfirst=True来指明最前面的是否是日:

parse('6/12/2011', dayfirst=True)
datetime.datetime(2011, 12, 6, 0, 0)

pandas通常可以用于处理由日期组成的数组,不论是否是DataFrame中的行索引或列。to_datetime方法能解析很多不同种类的日期表示。标准的日期格式,比如ISO 8601,能被快速解析:

datestrs = ['2011-07-06 12:00:00', '2011-08-06 00:00:00']
pd.to_datetime(datestrs)
DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00'], dtype='datetime64[ns]', freq=None)

还能处理一些应该被判断为缺失的值(比如None, 空字符串之类的):

idx = pd.to_datetime(datestrs + [None])
idx
DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00', 'NaT'], dtype='datetime64[ns]', freq=None)
idx[2]
NaT
pd.isnull(idx)
array([False, False,  True], dtype=bool)

Nat(Not a Time)pandas中,用于表示时间戳为空值(null value)。

dateutil.parse是一个很有用但不完美的工具。它可能会把一些字符串识别为日期,例如,'42’就会被解析为2042年加上今天的日期。

datetime对象还有一些关于地区格式(locale-specific formatting)的选项,用于处理不同国家或不同语言的问题。例如,月份的缩写在德国和法国,与英语是不同的。

相关文章:

  • 深度学习中文汉字识别 计算机竞赛
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • 腾讯云服务器公网带宽速度怎么样?上传下载实测!
  • 五、hdfs常见权限问题
  • 苍穹外卖--新增菜品
  • 【数据挖掘 机器学习 | 时间序列】时间序列必学模型: ARIMA超详细讲解
  • Windows 下 Sublime Text 2.0.2 下载及配置
  • fusion 360制作机械臂
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • adb shell settings高级指令设置系统属性所有的指令汇总+注释
  • Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用
  • 【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型
  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能
  • ChatGPT简介及基本概念
  • 吴恩达《机器学习》8-5->8-6:特征与直观理解I、样本与值观理解II
  • 收藏网友的 源程序下载网
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • docker容器内的网络抓包
  • Electron入门介绍
  • Python 反序列化安全问题(二)
  • Vue ES6 Jade Scss Webpack Gulp
  • 成为一名优秀的Developer的书单
  • 你真的知道 == 和 equals 的区别吗?
  • 前端攻城师
  • 如何使用 JavaScript 解析 URL
  • 微信公众号开发小记——5.python微信红包
  • 我的zsh配置, 2019最新方案
  • No resource identifier found for attribute,RxJava之zip操作符
  • Java性能优化之JVM GC(垃圾回收机制)
  • k8s使用glusterfs实现动态持久化存储
  • # 计算机视觉入门
  • #Ubuntu(修改root信息)
  • (175)FPGA门控时钟技术
  • (27)4.8 习题课
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (一)VirtualBox安装增强功能
  • (转)LINQ之路
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • **PHP分步表单提交思路(分页表单提交)
  • ../depcomp: line 571: exec: g++: not found
  • .Net 8.0 新的变化
  • .netcore 获取appsettings
  • .NET简谈设计模式之(单件模式)
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET与 java通用的3DES加密解密方法
  • /proc/stat文件详解(翻译)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @NestedConfigurationProperty 注解用法
  • [1204 寻找子串位置] 解题报告
  • [2018-01-08] Python强化周的第一天
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Android]Android开发入门之HelloWorld
  • [bzoj2957]楼房重建