热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pandaspivot计算占比_pandas使用9:如何处理时间序列数据

如何处理时间序列数据?importpandasaspdimportmatplotlib.pyplotaspltair_qualitypd.read_csv(data

如何处理时间序列数据?

import pandas as pd
import matplotlib.pyplot as plt

air_quality = pd.read_csv("data/air_quality_no2_long.csv")
air_quality = air_quality.rename(columns={"date.utc": "datetime"})
air_quality.head()

citycountrydatetimelocationparametervalueunit
0ParisFR2019-06-21 00:00:00+00:00FR04014no220.0µg/m³
1ParisFR2019-06-20 23:00:00+00:00FR04014no221.8µg/m³
2ParisFR2019-06-20 22:00:00+00:00FR04014no226.5µg/m³
3ParisFR2019-06-20 21:00:00+00:00FR04014no224.9µg/m³
4ParisFR2019-06-20 20:00:00+00:00FR04014no221.4µg/m³

air_quality.city.unique()

array(['Paris', 'Antwerpen', 'London'], dtype=object)

使用pandas的datetime类型

1、我想把datetime列从文本转换成datetime类型

air_quality["datetime"] = pd.to_datetime(air_quality["datetime"])
air_quality["datetime"]

0 2019-06-21 00:00:00+00:00
1 2019-06-20 23:00:00+00:00
2 2019-06-20 22:00:00+00:00
3 2019-06-20 21:00:00+00:00
4 2019-06-20 20:00:00+00:00
...
3442 2019-04-09 06:00:00+00:00
3443 2019-04-09 05:00:00+00:00
3444 2019-04-09 04:00:00+00:00
3445 2019-04-09 03:00:00+00:00
3446 2019-04-09 02:00:00+00:00
Name: datetime, Length: 3447, dtype: datetime64[ns, UTC]

datetime列的初始值是字符串,不支持任何datetime操作(例如,提取年份、星期等等)。通过应用to_datetime函数,pandas将解析字符串并将其转换为datetime(例如datetime64[ns, UTC])对象。在pandas中,我们称其datetime类型(由panda.Timestamp对象定义),它类似于python标准库中的datetime.datetime对象。

由于很多数据集将日期时间信息包含在其中一列中,因此pandas输入函数,例如.read_csv()在读取数据时,可以使用parse_dates参数将列的列表作为Timestamp对象读取到日期列。Timestamp对象非常有用,它有很多有用的特性。

1.1、时间序列数据中的起始和终止日期

air_quality["datetime"].min(), air_quality["datetime"].max()

(Timestamp('2019-04-09 01:00:00+0000', tz='UTC'),
Timestamp('2019-06-21 00:00:00+0000', tz='UTC'))

1.2、时间序列的时间长度是多少

air_quality["datetime"].max() - air_quality["datetime"].min()

Timedelta('72 days 23:00:00')

由Timestamp定义的时间可以轻地计算时间信息,如上面得到了两个时间点的时间间隔,这是个Timedelta对象,类型于Python标准库中的datetime.timedelta。

2、我想在原数据中添加一列,让它包含观测值的月份

air_quality["month"] = air_quality["datetime"].dt.month
air_quality.head()

citycountrydatetimelocationparametervalueunitmonth
0ParisFR2019-06-21 00:00:00+00:00FR04014no220.0µg/m³6
1ParisFR2019-06-20 23:00:00+00:00FR04014no221.8µg/m³6
2ParisFR2019-06-20 22:00:00+00:00FR04014no226.5µg/m³6
3ParisFR2019-06-20 21:00:00+00:00FR04014no224.9µg/m³6
4ParisFR2019-06-20 20:00:00+00:00FR04014no221.4µg/m³6

使用Timestamp对象,可以方便获得许多时间相关属性(年、月、季度)等信息,要访问这些属性,需要使用dt访问器。

3、每个观测站的一周内各天的平均浓度是多少?

air_quality.groupby(
    [air_quality["datetime"].dt.weekday, "location"])["value"].mean()

datetime location
0 BETR801 32.489583
FR04014 29.495417
London Westminster 29.425439
1 BETR801 30.083333
FR04014 34.402381
London Westminster 35.185345
2 BETR801 21.533333
FR04014 30.130579
London Westminster 30.121212
3 BETR801 24.615385
FR04014 28.749378
London Westminster 29.378723
4 BETR801 24.541667
FR04014 32.980851
London Westminster 30.192308
5 BETR801 28.500000
FR04014 24.955752
London Westminster 26.995434
6 BETR801 20.514286
FR04014 24.467917
London Westminster 26.685590
Name: value, dtype: float64

还记得groupby中提供的分组(split)-应用(apply)-组合(combine)模式吗?这里,我们要计算一周各天每个观测站的给定统计量(例如,平均浓度浓度)。为了对星期各天分组,我们使用pandas Timestamp的weekday属性(Monday=0和Sunday=6),使用dt访问器可以访问该属性。之后就对地点与日期进行分组,并计算各组平均值。

4、绘制所有站点一日内各时段的典型的浓度分布形式。换句话说,一天中每小时的平均值是多少?

fig, axs = plt.subplots(figsize=(12, 4))
air_quality.groupby(
    air_quality["datetime"].dt.hour)["value"].mean().plot(kind='bar',
                                                          rot=0,
                                                          ax=axs)
plt.xlabel("Hour of the day")
plt.ylabel("$NO_2 (µg/m^3)$");

fdb859e1e7cf3ad5635d87096f1f9a5a.png

和上面的情况类似,我们希望计算一天中每小时的给定统计数据(例如平均浓度),我们可以再次使用分组(split)-应用(apply)-组合(combine)方法。对于这个例子,使用dt访问器获得hour属性。

将datetime作为index使用

使用在改变图形布局教程中介绍pivot()函数将数据变换成如下方式:

no_2 = air_quality.pivot(index="datetime", columns="location", values="value")
no_2.head()

locationBETR801FR04014London Westminster
datetime
2019-04-09 01:00:00+00:0022.524.4NaN
2019-04-09 02:00:00+00:0053.527.467.0
2019-04-09 03:00:00+00:0054.534.267.0
2019-04-09 04:00:00+00:0034.548.541.0
2019-04-09 05:00:00+00:0046.559.541.0

datetime索引(即DatetimeIndex)提供了强大的功能。例如,我们无需dt访问器,直接在索引上就可访问这些属性:

no_2.index.year, no_2.index.weekday

(Int64Index([2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019,
...
2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019],
dtype='int64', name='datetime', length=1705),
Int64Index([1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
...
3, 3, 3, 3, 3, 3, 3, 3, 3, 4],
dtype='int64', name='datetime', length=1705))

datetime还有其他一些优点,比如可以方便地划分时间段或调整时间尺度。

5、绘制5月20日和5月21日各站NO2浓度图

no_2["2019-05-20":"2019-05-21"].plot()

182fae3e4ef2d53fe9a4361ac70326f1.png

datetimeIndex可以解析字符串日期,因此能够方便的划分不同时间断的子集。

将一种时间序列重采样(resample)成另一频率的数据。

6、将当前以小时为单位的时间序列变换成以月为单位,并取其中最大值。

monthly_max = no_2.resample("M").max()
monthly_max

locationBETR801FR04014London Westminster
datetime
2019-04-30 00:00:00+00:0072.5117.284.0
2019-05-31 00:00:00+00:0074.597.097.0
2019-06-30 00:00:00+00:0052.584.752.0

datetime索引的时间序列数据有一种非常强大的方法resample(),可以将时间序列重采样到另一个频率(例如,将每两天数据转换为5分钟数据)。

resample()方法和groupby操作很像:

  • 它通过使用字符串(例如M,5H,…)来定义目标频率,并基于此对时间分组
  • 它需要一个汇总函数,比如mean,max,...

当通过上述方法定义了时间频率后,就可以通过freq属性查看时间序列频率:

monthly_max.index.freq

7、绘制每个观测站的每日NO2浓度中值:

no_2.resample("D").mean().plot(style="-o", figsize=(10, 5));

31152da5aafd1a9a1a171f1d91a40ad5.png

--------------分割线------------------

pandas支持4种通用的时间概念

概念标量类型数组类型pandas数据类型基本创建方法
日期时间(Date times)TimestampDatetimeIndexdatetime64[ns]或者datetime64[ns, tz]to_datetime或者date_range
时间差(Time deltas)TimedeltaTimedeltaIndextimedelta64[ns]to_timedelta或者timedelta_range
时间跨度(Time spans)PeriodPeriodIndexperiod[freq]Period或者period_range
日期偏移量(Date offsets)DateOffsetNoneNoneDateOffset

1、日期时间(Datetime)
日期时间的标量数据类型为Timestamp也叫时间戳,它是用一个64位二进制带符号整数表达日期和时间,以便于时间计算。整数0,即时间戳的起点默认为1970-1-1 00:00:00。如果以秒为单位,那么整数值每加1,代表时间上也增加1秒。正整数代表后续时间,负整数则代表以前的时间。时间戳能表达的时间范围与单位有关,单位时间越短,能表达的时间范围也越窄,pandas默认的时间单位为纳秒,它可以表达时间范围为:

pd.to_datetime([2**63-1])     
#第64位为0,代表正数,此为上限,也可用pd.Timestamp.max查看

DatetimeIndex(['2262-04-11 23:47:16.854775807'], dtype='datetime64[ns]', freq=None)

pd.to_datetime([-2**63+808])  
#经测试,这个值是为下限,并未取完全部整数值,也可用pd.Timestamp.min查看

DatetimeIndex(['1677-09-21 00:12:43.145225'], dtype='datetime64[ns]', freq=None)

时间戳有若干日期时间属性,包括year、month、day、hour、minute、second、microsecond、nanosecond、date、time等等,其最突出的优点就是你可方便地使用部分属性将想要的值筛选出来。

2、时间差(Time deltas)
Time deltas表示的就是两个绝对时间点的差值,有了它你可以方便的计算时间(最大变化单位为天,最小为纳秒),而无需考虑时间变化的各种问题。

pd.to_datetime([0]) + pd.to_timedelta('1d') #增加 1 天

DatetimeIndex(['1970-01-02'], dtype='datetime64[ns]', freq=None)

pd.to_datetime([0]) + pd.to_timedelta('1m') #增加 1 分钟

DatetimeIndex(['1970-01-01 00:01:00'], dtype='datetime64[ns]', freq=None)

pd.to_datetime([0]) + pd.to_timedelta('1ns' )#增加 1 纳秒

DatetimeIndex(['1970-01-01 00:00:00.000000001'], dtype='datetime64[ns]', freq=None)

3、时间跨度(Time spans)
Time spans可以定义一种周期变量(period),通过设定变化频率可以方便控制期变化周期而无需考虑实际时间影响。

p = pd.Period('2020-1', freq='M') # 开始时间为2020年1月,以月为变化周期

p + 1 

Period('2020-02', 'M')

p + 5

Period('2020-06', 'M')

4、日期偏移量(Date offsets)
Date offsets也是一种时间变化形式,它和Time deltas的区别在于,Time deltas只考虑了时间的绝对差值,而无法顾及实际日期带来的影响,如工作日需要从周五跳转到周一。使用Date offsets正是为了解决类似问题,通过调用各种日期偏移方法,可以无需考虑日期具体形式。

bd = pd.offsets.BusinessDay() # 定义一个工作日的偏移量

friday = pd.to_datetime('2020-6-19')
friday.weekday()   # 0代表周一, 4代表周五

4

monday = friday + bd
monday.weekday()

0



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
百变精灵1980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有