python标准库包含于日期(date)和时间(time)数据的数据类型,datetime、time以及calendar模块会被经常用到。
datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差。
给datetime对象加上或减去一个或多个timedelta,会产生一个新的对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
1
2
3
4
5
6
7
8
9
10
|
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的时间解析函数
1
2
3
4
5
|
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方法可以解析多种不同的日期表示形式。
1
2
3
4
5
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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不同索引的时间序列之间的算术运算会自动按日期对齐
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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)通过时间范围进行切片索引
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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(索引的唯一一层)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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 |
1
2
|
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)应用
以上这篇python+pandas+时间、日期以及时间序列处理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/LY_ysys629/article/details/73822716