python+pandas+时间、日期以及时间序列处理方法
作者:LY_ysys629 发布时间:2021-09-08 04:46:32
先简单的了解下日期和时间数据类型及工具
python标准库包含于日期(date)和时间(time)数据的数据类型,datetime、time以及calendar模块会被经常用到。
datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差。
给datetime对象加上或减去一个或多个timedelta,会产生一个新的对象
from datetime import datetime
from datetime import timedelta
now = datetime.now()
now
datetime.datetime(2017, 6, 27, 15, 56, 56, 167000)
datetime参数:datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
delta = now - datetime(2017,6,27,10,10,10,10)
delta
datetime.timedelta(0, 20806, 166990)
delta.days
0
delta.seconds
20806
delta.microseconds
166990
只有这三个参数了!
datetime模块中的数据类型
类型 | 说明 |
---|---|
date | 以公历形式存储日历日期(年、月、日) |
time | 将时间存储为时、分、秒、毫秒 |
datetime | 存储日期和时间 |
timedelta | 表示两个datetime值之间的差(日、秒、毫秒) |
字符串和datetime的相互转换
1)python标准库函数
日期转换成字符串:利用str 或strftime
字符串转换成日期:datetime.strptime
stamp = datetime(2017,6,27)
str(stamp)
'2017-06-27 00:00:00'
stamp.strftime('%y-%m-%d')#%Y是4位年,%y是2位年
'17-06-27'
#对多个时间进行解析成字符串
date = ['2017-6-26','2017-6-27']
datetime2 = [datetime.strptime(x,'%Y-%m-%d') for x in date]
datetime2
[datetime.datetime(2017, 6, 26, 0, 0), datetime.datetime(2017, 6, 27, 0, 0)]
2)第三方库dateutil.parser的时间解析函数
from dateutil.parser import parse
parse('2017-6-27')
datetime.datetime(2017, 6, 27, 0, 0)
parse('27/6/2017',dayfirst =True)
datetime.datetime(2017, 6, 27, 0, 0)
3)pandas处理成组日期
pandas通常用于处理成组日期,不管这些日期是DataFrame的轴索引还是列,to_datetime方法可以解析多种不同的日期表示形式。
date
['2017-6-26', '2017-6-27']
import pandas as pd
pd.to_datetime(date)
DatetimeIndex(['2017-06-26', '2017-06-27'], dtype='datetime64[ns]', freq=None)
datetime 格式定义
代码 | 说明 |
---|---|
%Y | 4位数的年 |
%y | 2位数的年 |
%m | 2位数的月[01,12] |
%d | 2位数的日[01,31] |
%H | 时(24小时制)[00,23] |
%l | 时(12小时制)[01,12] |
%M | 2位数的分[00,59] |
%S | 秒[00,61]有闰秒的存在 |
%w | 用整数表示的星期几[0(星期天),6] |
%F | %Y-%m-%d简写形式例如,2017-06-27 |
%D | %m/%d/%y简写形式 |
pandas时间序列基础以及时间、日期处理
pandas最基本的时间序列类型就是以时间戳(时间点)(通常以python字符串或datetime对象表示)为索引的Series:
dates = ['2017-06-20','2017-06-21',\
'2017-06-22','2017-06-23','2017-06-24','2017-06-25','2017-06-26','2017-06-27']
import numpy as np
ts = pd.Series(np.random.randn(8),index = pd.to_datetime(dates))
ts
2017-06-20 0.788811
2017-06-21 0.372555
2017-06-22 0.009967
2017-06-23 -1.024626
2017-06-24 0.981214
2017-06-25 0.314127
2017-06-26 -0.127258
2017-06-27 1.919773
dtype: float64
ts.index
DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23',
'2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'],
dtype='datetime64[ns]', freq=None)
pandas不同索引的时间序列之间的算术运算会自动按日期对齐
ts[::2]#从前往后每隔两个取数据
2017-06-20 0.788811
2017-06-22 0.009967
2017-06-24 0.981214
2017-06-26 -0.127258
dtype: float64
ts[::-2]#从后往前逆序每隔两个取数据
2017-06-27 1.919773
2017-06-25 0.314127
2017-06-23 -1.024626
2017-06-21 0.372555
dtype: float64
ts + ts[::2]#自动数据对齐
2017-06-20 1.577621
2017-06-21 NaN
2017-06-22 0.019935
2017-06-23 NaN
2017-06-24 1.962429
2017-06-25 NaN
2017-06-26 -0.254516
2017-06-27 NaN
dtype: float64
索引为日期的Series和DataFrame数据的索引、选取以及子集构造
方法:
1).index[number_int]
2)[一个可以被解析为日期的字符串]
3)对于,较长的时间序列,只需传入‘年'或‘年月'可返回对应的数据切片
4)通过时间范围进行切片索引
ts
2017-06-20 0.788811
2017-06-21 0.372555
2017-06-22 0.009967
2017-06-23 -1.024626
2017-06-24 0.981214
2017-06-25 0.314127
2017-06-26 -0.127258
2017-06-27 1.919773
dtype: float64
ts[ts.index[2]]
0.0099673896063391908
ts['2017-06-21']#传入可以被解析成日期的字符串
0.37255538918121028
ts['21/06/2017']
0.37255538918121028
ts['20170621']
0.37255538918121028
ts['2017-06']#传入年或年月
2017-06-20 0.788811
2017-06-21 0.372555
2017-06-22 0.009967
2017-06-23 -1.024626
2017-06-24 0.981214
2017-06-25 0.314127
2017-06-26 -0.127258
2017-06-27 1.919773
dtype: float64
ts['2017-06-20':'2017-06-23']#时间范围进行切片
2017-06-20 0.788811
2017-06-21 0.372555
2017-06-22 0.009967
2017-06-23 -1.024626
dtype: float64
带有重复索引的时间序列
1).index.is_unique检查索引日期是否是唯一的
2)对非唯一时间戳的数据进行聚合,通过groupby,并传入level = 0(索引的唯一一层)
dates = pd.DatetimeIndex(['2017/06/01','2017/06/02','2017/06/02','2017/06/02','2017/06/03'])
dates
DatetimeIndex(['2017-06-01', '2017-06-02', '2017-06-02', '2017-06-02',
'2017-06-03'],
dtype='datetime64[ns]', freq=None)
dup_ts = pd.Series(np.arange(5),index = dates)
dup_ts
2017-06-01 0
2017-06-02 1
2017-06-02 2
2017-06-02 3
2017-06-03 4
dtype: int32
dup_ts.index.is_unique
False
dup_ts['2017-06-02']
2017-06-02 1
2017-06-02 2
2017-06-02 3
dtype: int32
grouped = dup_ts.groupby(level=0).mean()
grouped
2017-06-01 0
2017-06-02 2
2017-06-03 4
dtype: int32
dup_df = pd.DataFrame(np.arange(10).reshape((5,2)),index = dates )
dup_df
0 | 1 | |
---|---|---|
2017-06-01 | 0 | 1 |
2017-06-02 | 2 | 3 |
2017-06-02 | 4 | 5 |
2017-06-02 | 6 | 7 |
2017-06-03 | 8 | 9 |
grouped_df = dup_df.groupby(level=0).mean()##针对DataFrame
grouped_df
0 | 1 | |
---|---|---|
2017-06-01 | 0 | 1 |
2017-06-02 | 4 | 5 |
2017-06-03 | 8 | 9 |
总结
该篇博客主要内容:
1)字符串、日期的转换方法
2)日期和时间的主要python,datetime、timedelta、pandas.to_datetime等
3)以时间为索引的Series和DataFrame的索引、切片
4)带有重复时间索引时的索引,.groupby(level=0)应用
来源:https://blog.csdn.net/LY_ysys629/article/details/73822716


猜你喜欢
- 前言说到 vue 中的 watch 方法,大家可能首先想到,它是用来监听数据的变化,一旦数据发生变化可以执行一些其他的操作。但是 watch
- Python空格的转义字符因为平时用到空格都是直接打一个空格,今天突然想到空格的转义字符是什么。查了查,发现空格没有像换行(\n)、制表符(
- 那就废话不多说,直接上代码吧!new_array = np.zeros((107,4))# 共107行 每行4列 初值为0>>&
- 问题:根据数据某列进行分组,选择其中另一列大小top-K的的所在行数据解析:求解思路很清晰,即先用groupby对数据进行分组,然后再根据分
- 在网上查了部分资料但是发现粘上去的代码都存在问题,无奈只好自己修改了一下,代码如下: 如下代码能正常运行,都是网上查找资料最后拼凑总结出来的
- 统计平均数SELECT AVG() FROM 语法用于从数据表中统计数据平均数。语法:SELECT AVG(column) FROM tb_
- 首先说一下 我在form表单里面遇见的坑:1.例如我要给后台传的不是对象,而是一个数组,怎么写验证?2.比如我有四个弹出框,都要做验证,这个
- 如何编写一个只在Web服务关闭时执行的程序?如:<SCRIPT LANGUAGE="VBScript"&
- 目录定时器概念实现一个简单的定时程序方案一方案二定时器概念什么是定时器呢?它是指从指定的时刻开始,经过一个指定时间,然后触发一个事件,用户可
- 使用循环神经网络(RNN)实现影评情感分类作为对循环神经网络的实践,我用循环神经网络做了个影评情感的分类,即判断影评的感 * 彩是正面的,还是
- 为了防止采集,我试过各种方法,绝大多数方法是“ * 剑”---防止了采集,也影响了搜索引擎收录,实在不爽!一天本人忽发奇想:何不
- 1、除法相关在python3之前,print 13/4 #result=3然而在这之后,却变了!print(13 / 4) #r
- 演示:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//
- quiver绘制表示梯度变化非常有用,下面是学习过程中给出的两个例子,可以很好理解quiver的用法from pylab import *c
- --新增表字段 ALTER procedure [dbo].[sp_Web_TableFiled_Insert] ( @TableName
- 复数是由一个实数和一个虚数组合构成,表示为:x+yj一个复数时一对有序浮点数(x,y),其中x是实数部分,y是虚数部分。Python语言中有
- 代码import psutilprint(dir(psutil))# 查看逻辑cpu的个数print(psutil.cpu_count())
- 这里以将Apache的日志写入到ElasticSearch为例,来演示一下如何使用Python将Spark数据导入到ES中。实际工作中,由于
- 一、把一个字符串的内容提取出来,并放到字典中流程如下: 1、得到字符串s,通过分割提取得到s1(是个列表) s=”name=lyy&
- 问题:最新在爬取某站点的时候,发现在post请求当中,参数构造正确却获取不到数据,索性将post的参数urlencode之后放到post请求