数据导入与预处理-拓展-pandas时间数据处理01(上)

简介: 数据导入与预处理-拓展-pandas时间数据处理01Pandas时序数据系列博客Pandas时间序列数据处理1.好用的Python库2.Pandas历史

Pandas时间序列数据处理

1.好用的Python库

Python很强大,有很多的好用的库:

2.Pandas历史

本文主要介绍Pandas库,Pandas在数据科学中十分常用,Pandas的位置如下:

Pandas诞生于2008年,它的开发者是Wes McKinney,一个量化金融分析工程师。因为疲于应付繁杂的财务数据,Wes McKinney便自学Python,并开发了Pandas。

2009年底,开源,今天得到了来自世界各地志同道合的个人社区的积极支持。

自2015年以来,pandas是NumFOCUS赞助的项目。


为什么叫作Pandas,其实这是“Python data analysis”的简写,同时也衍生自计量经济学术语“panel data”(面板数据)。

主要的贡献者



3.时序数据处理

Pandas可以处理很多的数据类型,其中最初始也最有趣的数据类型之一就是时间序列数据。Pandas 基本上是为分析金融时间序列数据而开发的,并为处理时间、日期和时间序列数据提供了一整套全面的框架。时间序列数据在很对行业都有应用,如股票价格变化、天气记录、患者健康指标、和应用程序性能监控等。



3.1 时序中的基本对象

时间序列的概念在日常生活中十分常见,但对于一个具体的时序事件而言,可以从多个时间对象的角度来描述。例如2020年9月7日周一早上8点整需要到教室上课,这个课会在当天早上10点结束,其中包含了哪些时间概念?

第一,会出现时间戳(Date times)的概念,即'2020-9-7 08:00:00'和'2020-9-7 10:00:00'这两个时间点分别代表了上课和下课的时刻,在pandas中称为Timestamp。同时,一系列的时间戳可以组成DatetimeIndex,而将它放到Series中后,Series的类型就变为了datetime64[ns],如果有涉及时区则为datetime64[ns, tz],其中tz是timezone的简写。


第二,会出现时间差(Time deltas)的概念,即上课需要的时间,两个Timestamp做差就得到了时间差,pandas中利用Timedelta来表示。类似的,一系列的时间差就组成了TimedeltaIndex, 而将它放到Series中后,Series的类型就变为了timedelta64[ns]。


第三,会出现时间段(Time spans)的概念,即在8点到10点这个区间都会持续地在上课,在pandas利用Period来表示。类似的,一系列的时间段就组成了PeriodIndex, 而将它放到Series中后,Series的类型就变为了Period。


第四,会出现日期偏置(Date offsets)的概念,假设你只知道9月的第一个周一早上8点要去上课,但不知道具体的日期,那么就需要一个类型来处理此类需求。再例如,想要知道2020年9月7日后的第30个工作日是哪一天,那么时间差就解决不了你的问题,从而pandas中的DateOffset就出现了。同时,pandas中没有为一列时间偏置专门设计存储类型,理由也很简单,因为需求比较奇怪,一般来说我们只需要对一批时间特征做一个统一的特殊日期偏置。


通过这个简单的例子,就能够容易地总结出官方文档中的这个表格:

概念 单元素类型 数组类型 pandas数据类型
Date times Timestamp DatetimeIndex datetime64[ns]
Time deltas Timedelta TimedeltaIndex timedelta64[ns]
Time spans Period PeriodIndex period[freq]
Date offsets DateOffset None None

由于时间段对象Period/PeriodIndex的使用频率并不高,因此将不进行讲解,而只涉及时间戳序列、时间差序列和日期偏置的相关内容。

我们可以将时间序列数据定义为在不同时间间隔获得并按时间顺序排列的数据点的集合


3.2 python中的datetime模块

datetime模块,主要掌握:datetime.date(), datetime.datetime(), datetime.timedelta()

日期解析方法:parser.parse

1. date对象:

# datetime.date:date对象
import datetime  # 也可以写 from datetime import date
today = datetime.date.today()
print(today,type(today))
# datetime.date.today 返回今日
# 输出格式为 date类 (年,月,日) → 直接得到当时日期
t = datetime.date(2022,10,1)
print(t)

输出为:

2022-10-21 <class 'datetime.date'>
2022-10-01

2. datetime对象

# datetime.datetime:datetime对象
now = datetime.datetime.now()
print(now,type(now))
# .now()方法,输出当前时间
# 输出格式为 datetime类
# 可通过str()转化为字符串
t1 = datetime.datetime(2022,10,1)
t2 = datetime.datetime(2022,10,1,1,0,0)
print(t1,t2)
# (年,月,日,时,分,秒),至少输入年月日
print("*"*10)
print(t2-t1)
t2-t1 # 输出为 datetime.timedelta(0, 3600)
# 相减得到时间差 —— timedelta

输出为:

2022-10-21 19:43:08.461654 <class 'datetime.datetime'>
2022-10-01 00:00:00 2022-10-01 01:00:00
**********
1:00:00
datetime.timedelta(0, 3600)

3. datetime.timedelta:时间差

# datetime.timedelta:时间差
today = datetime.datetime.today()  # datetime.datetime也有today()方法
yestoday = today - datetime.timedelta(1)  # 
print(today)
print(yestoday)
print(today - datetime.timedelta(7))
# 时间差主要用作时间的加减法,相当于可被识别的时间“差值”

输出为:

2022-10-21 19:44:23.097770
2022-10-20 19:44:23.097770
2022-10-14 19:44:23.097770

4. parser.parse:日期字符串转换

# parser.parse:日期字符串转换
from dateutil.parser import parse
date = '10-01-2022'
t = parse(date)
print(t,type(t))
# 直接将str转化成datetime.datetime
print(parse('2022-10-1'),'\n',
     parse('10/2/2021'),'\n',
     parse('10/3/2022', dayfirst = True),'\n',  # 国际通用格式中,日在月之前,可以通过dayfirst来设置
     parse('10/4/2022'),'\n',
     parse('Jan 31, 2022 10:45 PM'))
# 各种格式可以解析,但无法支持中文

输出为:

2022-10-01 00:00:00 <class 'datetime.datetime'>
2022-10-01 00:00:00 
 2021-10-02 00:00:00 
 2022-03-10 00:00:00 
 2022-10-04 00:00:00 
 2022-01-31 22:45:00

3.3. 时间戳(Date times)的构造与属性

概念 单元素类型 数组类型 pandas数据类型
Date times Timestamp DatetimeIndex datetime64[ns]
Time deltas Timedelta TimedeltaIndex timedelta64[ns]
Time spans Period PeriodIndex period[freq]
Date offsets DateOffset None None

1.Timestamp对象

单个时间戳的生成利用pd.Timestamp实现,一般而言的常见日期格式都能被成功地转换:

创建时间戳:

import datetime
import numpy as np
import pandas as pd
date1 = datetime.datetime(2020,1,2,3,4,5)  # 创建一个datetime.datetime
date2 = '2020-1-2 03:04:05'
# ts = pd.Timestamp(date1) # 这几种效果一样
# ts = pd.Timestamp(date2) # 这几种效果一样
ts = pd.Timestamp('2020-1-2 03:04:05') # 这几种效果一样
ts

输出为:

Timestamp('2020-01-02 03:04:05')

通过year, month, day, hour, min, second可以获取具体的数值:

# 通过year, month, day, hour, min, second可以获取具体的数值:
print("*"*10)
print(ts.year)
print("*"*10)
print(ts.month)
print("*"*10)
print(ts.day)
print("*"*10)
print(ts.hour)
print("*"*10)
print(ts.minute)
print("*"*10)
print(ts.second)

输出为:

**********
2020
**********
1
**********
2
**********
3
**********
4
**********
5

pandas中,时间戳的最小精度为纳秒ns,由于使用了64位存储,可以表示的时间范围大约可以如下计算:

image.png


通过pd.Timestamp.maxpd.Timestamp.min可以获取时间戳表示的范围,可以看到确实表示的区间年数大小正如上述计算结果:

print(pd.Timestamp.max)
# Timestamp('2262-04-11 23:47:16.854775807')
print(pd.Timestamp.min)
# Timestamp('1677-09-21 00:12:43.145225')
pd.Timestamp.max.year - pd.Timestamp.min.year
# 585

输出为:

2 Datetime序列的生成

一组时间戳可以组成时间序列,可以用to_datetime和date_range来生成。其中,to_datetime能够把一列时间戳格式的对象转换成为datetime64[ns]类型的时间序列.

datetime64[ns]本质上可以理解为一个大整数,对于一个该类型的序列,可以使用max, min, mean,来取得最大时间戳、最小时间戳和“平均”时间戳


下面先对to_datetime方法进行演示:

1. to_datetime方法

单个时间数据,生成Timestamp:

# pd.to_datetime
from datetime import datetime
# pd.to_datetime():如果是单个时间数据,转换成pandas的时刻数据,数据类型为Timestamp
date1 = datetime(2020,1,2,3,4,5)
t1 = pd.to_datetime(date1)
print(t1,type(t1))
t1
# 2020-01-02 03:04:05 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
# Timestamp('2020-01-02 03:04:05')

输出为:


多个时间数据生成DatetimeIndex:

lst_date = [ '2020-12-21', '2020-12-22', '2020-12-23']
t3 = pd.to_datetime(lst_date)
print(t3,type(t3))
t3
# DatetimeIndex(['2020-12-21', '2020-12-22', '2020-12-23'], dtype='datetime64[ns]', freq=None) <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
# 多个时间数据,将会转换为pandas的DatetimeIndex

输出为:

时间戳格式转换

在极少数情况,时间戳的格式不满足转换时,可以强制使用format进行匹配:

temp = pd.to_datetime(['2020\\1\\1','2020\\1\\3'],format='%Y\\%m\\%d')
temp 
# DatetimeIndex(['2020-01-01', '2020-01-03'], dtype='datetime64[ns]', freq=None)

输出为:

传入列表和series的返回值:

注意上面由于传入的是列表,而非pandas内部的Series,因此返回的是DatetimeIndex,如果想要转为datetime64[ns]的序列,需要显式用Series转化:

# DatetimeIndex
# DatetimeIndex(['2020-01-01', '2020-01-03'], dtype='datetime64[ns]', freq=None)
temp = pd.to_datetime(['2020\\1\\1','2020\\1\\3'],format='%Y\\%m\\%d')
print(temp)
# datetime64[ns]序列
pd.Series(temp).head()

输出为:


相关文章
|
1月前
|
数据采集 数据挖掘 数据处理
如何使用 Pandas 库进行数据清洗和预处理?
数据清洗和预处理是数据分析中至关重要的步骤,Pandas库提供了丰富的函数和方法来完成这些任务
64 8
|
1月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
72 0
|
3月前
|
数据采集 数据可视化 数据挖掘
Pandas函数大合集:数据处理神器一网打尽!
Pandas函数大合集:数据处理神器一网打尽!
43 0
|
3月前
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
99 0
|
1月前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
43 2
|
2月前
|
并行计算 大数据 数据处理
亿级数据处理,Pandas的高效策略
在大数据时代,数据量的爆炸性增长对处理技术提出更高要求。本文介绍如何利用Python的Pandas库及其配套工具高效处理亿级数据集,包括:采用Dask进行并行计算,分块读取以减少内存占用,利用数据库进行复杂查询,使用内存映射优化Pandas性能,以及借助PySpark实现分布式数据处理。通过这些方法,亿级数据处理变得简单高效,助力我们更好地挖掘数据价值。
108 1
|
2月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
93 3
|
3月前
|
数据采集 数据挖掘 数据处理
Pandas实践:南京地铁数据处理分析
Pandas实践:南京地铁数据处理分析
43 2
|
4月前
|
数据采集 数据挖掘 数据处理
解锁Python数据分析新技能!Pandas实战学习,让你的数据处理能力瞬间飙升!
【8月更文挑战第22天】Python中的Pandas库简化了数据分析工作。本文通过分析一个金融公司的投资数据文件“investment_data.csv”,介绍了Pandas的基础及高级功能。首先读取并检查数据,包括显示前几行、列名、形状和数据类型。随后进行数据清洗,移除缺失值与重复项。接着转换日期格式,并计算投资收益。最后通过分组计算平均投资回报率,展示了Pandas在数据处理与分析中的强大能力。
49 0
|
5月前
|
数据采集 机器学习/深度学习 数据处理
从基础到卓越:Pandas与NumPy在复杂数据处理中的实战策略
【7月更文挑战第14天】Pandas与NumPy在数据科学中的核心应用:**加载数据(如`read_csv`)、探索(`head()`, `info()`, `describe()`)、数据清洗(`fillna`, `dropna`, `replace`, `apply`)、数值计算(借助NumPy的`ndarray`)、分组聚合(`groupby`与聚合函数)、窗口函数(如`rolling`)和数据筛选排序(布尔索引,`query`,`sort_values`)。通过这些工具,实现从数据预处理到复杂分析的高效处理。
68 0