pandas 包含广泛的功能和特性,可用于处理所有领域的时间序列数据。
pandas 捕获了 4 个与时间相关的一般概念:
日期时间:具有时区支持的特定日期和时间。类似于datetime.datetime
标准库。
时间增量:绝对持续时间。类似于datetime.timedelta
标准库。
时间跨度:由时间点及其相关频率定义的时间跨度。
日期偏移量:尊重日历算术的相对持续时间。dateutil.relativedelta.relativedelta
与dateutil
包装类似。
Concept |
Scalar Class |
Array Class |
pandas Data Type |
Primary Creation Method |
---|---|---|---|---|
Date times |
|
|
|
|
Time deltas |
|
|
|
|
Time spans |
|
|
|
|
Date offsets |
|
|
|
|
Series和DataFrame具有扩展的数据类型支持和功能datetime
,timedelta
以及Period
传递到这些构造函数时的数据。 然而DateOffset
,数据将作为object
数据存储。
目录
目录
1.日期功能(Datetime)
1.1 .to_datetime()从各种来源和格式解析时间序列信息
1.2 .date_range()生成固定频率日期和时间跨度的序列
1.3 .dt访问器
2.时间增量(Timedelta)
2.1 设置基础时间差
2.2 时间差计算
基本语法:
pd.to_datetime([datetim1,datetime2....])
示例:将文本日期、numpy日期和自带的datetime日期转化为pandas日期类型
#创建日期
import pandas as pd
import numpy as np
import datetime
dateList = pd.to_datetime(
["1/1/2018", np.datetime64("2018-01-01"), datetime.datetime(2018, 1, 1)]
)
dateList
#输出结果:
DatetimeIndex(['2018-01-01', '2018-01-01', '2018-01-01'], dtype='datetime64[ns]', freq=None)
基本语法:
pd.date_range('xxxx-xx-xx',periods=x,freq="x")
其中第一项参数为开始时期,格式为xxxx-xx-xx(年-月-日)
第二项参数periods=x,x为整数类型,表示跨度,例如periods=5;
第三项参数freq=“x”,x为频率,可选数值有 :
#B 工作日
#D 自然日
#W 每周
#M 每月
#S 秒频率
#ms 毫秒频率
#A 年度频率
示例:
#创建日期
import pandas as pd
dateList = pd.date_range('2020-01-01',periods=5)
#输出结果:
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05'],
dtype='datetime64[ns]', freq='D')
#freq='D' #频率是天,M频率是月
dateList = pd.date_range('2020-01-01',periods=5,freq="M")
#输出结果:
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
'2020-05-31'],
dtype='datetime64[ns]', freq='M')
#business工作日,freq="B",获取工作日的时间
dateList = pd.bdate_range('2020-01-01',periods=10,freq='B')
#输出结果:
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-06',
'2020-01-07', '2020-01-08', '2020-01-09', '2020-01-10',
'2020-01-13', '2020-01-14'],
dtype='datetime64[ns]', freq='B')
Series
提供一个可以简单、快捷地返回 datetime
属性值的访问器。这个访问器返回的也是 Series,索引与现有的 Series 一样。
示例:
s = pd.Series(pd.date_range('20220101 09:10:12', periods=4))
#输出结果
0 2022-01-01 09:10:12
1 2022-01-02 09:10:12
2 2022-01-03 09:10:12
3 2022-01-04 09:10:12
s.dt.hour
#输出结果
0 9
1 9
2 9
3 9
dtype: int64
s.dt.second
#输出结果
0 12
1 12
2 12
3 12
dtype: int64
s.dt.day
#输出结果
0 1
1 2
2 3
3 4
dtype: int64
用下列表达式进行筛选非常方便:
s[s.dt.day == 2]
#输出结果
1 2022-01-02 09:10:12
dtype: datetime64[ns]
还可以用 Series.dt.strftime()把 datetime
的值当成字符串进行格式化,支持与标准strftime()同样的格式。
s = pd.Series(pd.date_range('20220101', periods=4))
#输出结果
0 2022-01-01
1 2022-01-02
2 2022-01-03
3 2022-01-04
dtype: datetime64[ns]
#转换为字符串格式
s.dt.strftime('%Y/%m/%d')
#输出结果
0 2022/01/01
1 2022/01/02
2 2022/01/03
3 2022/01/04
dtype: object
时间增量是时间上的差异,以差异单位表示,例如天、小时、分钟、秒。它们既可以是正向的,也可以是逆向的。
Timedelta
是datetime.timedelta
的子类,行为方式类似,但允许与np.timedelta64
类型以及大量自定义表示、解析和属性兼容。
#设置时间差
timediff = pd.Timedelta('2 days 2 hours 15 minutes 30seconds')
timediff
#输出结果
Timedelta('2 days 02:15:30')
#通过整数设置时间差
timediff = pd.Timedelta(6,unit='h')
timediff
#输出结果
Timedelta('0 days 06:00:00')
timediff = pd.Timedelta(days=2)
timediff
#输出结果
Timedelta('2 days 00:00:00')
示例:
s = pd.Series(pd.date_range('2020-1-1',periods=3,freq="D"))
#输出结果
0 2020-01-01
1 2020-01-02
2 2020-01-03
dtype: datetime64[ns]
td = pd.Series([pd.Timedelta(days=i) for i in range(3)])
#输出结果
0 0 days
1 1 days
2 2 days
dtype: timedelta64[ns]
#时间相加
s+td
#输出结果
0 2020-01-01
1 2020-01-03
2 2020-01-05
dtype: datetime64[ns]
#时间相减
s-td
#输出结果
0 2020-01-01
1 2020-01-01
2 2020-01-01
dtype: datetime64[ns]
#复合运算
s-2*td
#输出结果
0 2020-01-01
1 2019-12-31
2 2019-12-30
dtype: datetime64[ns]