python时间日期函数与利用pandas进行时间序列处理详解

作者:wdc 时间:2023-06-15 20:39:40 

python标准库包含于日期(date)和时间(time)数据的数据类型,datetime、time以及calendar模块会被经常用到。

datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差。

下面我们先简单的了解下python日期和时间数据类型及工具

给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 格式定义

代码说明
%Y4位数的年
%y2位数的年
%m2位数的月[01,12]
%d2位数的日[01,31]
%H时(24小时制)[00,23]
%l时(12小时制)[01,12]
%M2位数的分[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


01
2017-06-0101
2017-06-0223
2017-06-0245
2017-06-0267
2017-06-0389


grouped_df = dup_df.groupby(level=0).mean()##针对DataFrame

grouped_df


01
2017-06-0101
2017-06-0245
2017-06-0389

本文总结了以下4个知识点

1)字符串、日期的转换方法

2)日期和时间的主要python,datetime、timedelta、pandas.to_datetime等

3)以时间为索引的Series和DataFrame的索引、切片

4)带有重复时间索引时的索引,.groupby(level=0)应用

来源:http://blog.csdn.net/LY_ysys629/article/details/73822716

标签:python时间日期,pandas
0
投稿

猜你喜欢

  • sql如何在Access中选择指定日期前的记录?

    2010-06-17 12:47:00
  • python使用PIL剪切和拼接图片

    2022-06-26 07:41:55
  • Python安装Pytorch最新图文教程

    2022-08-07 21:44:14
  • Python 做曲线拟合和求积分的方法

    2021-03-03 01:46:07
  • python3中dict.keys().sort()用不了的解决方法

    2023-08-16 11:33:54
  • Scrapy模拟登录赶集网的实现代码

    2023-02-22 20:33:47
  • 可能被你忽略的 JavaScript 代码陷阱

    2009-12-26 18:16:00
  • mysql查询表是否被锁的方法

    2024-01-19 13:16:41
  • JavaScript中访问节点对象的方法有哪些如何使用

    2024-06-18 10:50:36
  • MySQL 序列 AUTO_INCREMENT详解及实例代码

    2024-01-20 17:04:37
  • Python函数定义及传参方式详解(4种)

    2022-08-16 14:39:08
  • 详解Golang编程中的常量与变量

    2024-04-30 10:04:33
  • python中的tcp示例详解

    2021-06-21 21:09:46
  • MySQL中的唯一性约束与NULL详解

    2024-01-13 10:24:10
  • Django Web开发中django-debug-toolbar的配置以及使用

    2022-12-15 22:32:14
  • Django中auth模块用户认证的使用

    2023-02-08 13:49:58
  • Pandas处理时间序列数据操作详解

    2021-06-19 07:21:45
  • sql 查询记录数结果集某个区间内记录

    2023-07-09 08:25:01
  • 解决Vue+SpringBoot+Shiro跨域问题

    2024-05-05 09:06:03
  • Python中如何实现MOOC扫码登录

    2021-10-08 14:24:50
  • asp之家 网络编程 m.aspxhome.com