看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
时间序列(Time series)数据是非常重要的数据类型,在各个领域的研究中,都与时间相关,因此对于时间数据的处理就越来越重要。Pandas 提供了多种时间数据类型和处理方法。
主要有:
概念 | 标量 | Array 类 | pandas 类型 | 创建方法 |
---|---|---|---|---|
固定时间 Date times | Timestamp | DatetimeIndex | datetime64[ns] or datetime64[ns, tz] | to_datetime or date_range |
时长 Time deltas | Timedelta | TimedeltaIndex | timedelta64[ns] | to_timedelta or timedelta_range |
周期 Time spans | Period | PeriodIndex | period[freq] | Period or period_range |
日期偏移 Date offsets | DateOffset | None | None | DateOffset |
通常时间序列数据作为 Series 或 DataFrame 的索引,以方便对时间数据进行操作。
# 指定开始时间和频率,周期数
pd.Series(range(3), index=pd.date_range('2000', freq='D', periods=3))
'''
2000-01-01 0
2000-01-02 1
2000-01-03 2
Freq: D, dtype: int64
'''
当传递给这些构造函数时,Series 和 DataFrame 具有扩展的数据类型,以支持时间类型 和 Period 周期数据类型功能,但是 DateOffset 数据将存储为 object 对象数据。
pd.Series(pd.period_range('1/1/2011', freq='M', periods=3))
'''
0 2011-01
1 2011-02
2 2011-03
dtype: period[M]
'''
pd.Series([pd.DateOffset(1), pd.DateOffset(2)])
'''
0 <DateOffset>
1 <2 * DateOffsets>
dtype: object
'''
pd.Series(pd.date_range('1/1/2011', freq='M', periods=3))
'''
0 2011-01-31
1 2011-02-28
2 2011-03-31
dtype: datetime64[ns]
'''
也可以在 Series 和 DataFrame 中将时间序列作为具体的值:
pd.Series(pd.date_range('2000', freq='D', periods=3))
'''
0 2000-01-01
1 2000-01-02
2 2000-01-03
dtype: datetime64[ns]
'''
对于时间的缺失值,有专门的 NaT
来表示:
pd.Timestamp(pd.NaT)
# NaT
pd.Timedelta(pd.NaT)
# NaT
pd.Period(pd.NaT)
# NaT
# 类似 np.nan
pd.NaT == pd.NaT
# False
可以使用以下几个方法将一个数据转化为时间类型:
import datetime
dti = pd.to_datetime(['1/1/2018', # 类时间字符串
np.datetime64('2018-01-01'), # numpy 的时间类型
datetime.datetime(2018, 1, 1)]) # python 自带时间类型
dti
'''
DatetimeIndex(['2018-01-01',
'2018-01-01',
'2018-01-01'],
dtype='datetime64[ns]', freq=None)
'''
生成时间范围固定频率的序列,以下周期频率为小时:
dti = pd.date_range('2018-01-01', periods=3, freq='H')
dti
'''
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 01:00:00',
'2018-01-01 02:00:00'],
dtype='datetime64[ns]', freq='H')
'''
时区的转换:
dti = dti.tz_localize('UTC')
dti
'''
DatetimeIndex(['2018-01-01 00:00:00+00:00', '2018-01-01 01:00:00+00:00',
'2018-01-01 02:00:00+00:00'],
dtype='datetime64[ns, UTC]', freq='H')
'''
dti.tz_convert('US/Pacific')
'''
DatetimeIndex(['2017-12-31 16:00:00-08:00', '2017-12-31 17:00:00-08:00',
'2017-12-31 18:00:00-08:00'],
dtype='datetime64[ns, US/Pacific]', freq='H')
'''
将时间序列重采样或转换为特定频率:
idx = pd.date_range('2018-01-01', periods=5, freq='H')
ts = pd.Series(range(len(idx)), index=idx)
ts
'''
2018-01-01 00:00:00 0
2018-01-01 01:00:00 1
2018-01-01 02:00:00 2
2018-01-01 03:00:00 3
2018-01-01 04:00:00 4
Freq: H, dtype: int64'
'''
# 将一小时转换为两小时,聚合时取均值
ts.resample('2H').mean()
'''
2018-01-01 00:00:00 0.5
2018-01-01 02:00:00 2.5
2018-01-01 04:00:00 4.0
Freq: 2H, dtype: float64
'''
以绝对或相对时间增量执行日期和时间计算:
friday = pd.Timestamp('2018-01-05')
friday.day_name()
# 'Friday'
# 增加一天
saturday = friday + pd.Timedelta('1 day')
saturday.day_name()
# 'Saturday'
# 增加一个工作日,从周五到周一
monday = friday + pd.offsets.BDay()
monday.day_name()
# 'Monday'
更新时间:2020-06-09 15:41:04 标签:pandas 时间