目录
1 时序中的基本对象
- 【例子】:例如2020年9月7日周一早上8点整需要到教室上课,这个课会在当天早上10点结束
- 时间戳(Date times):即’2020-9-7 08:00:00’和’2020-9-7 10:00:00’这两个时间点分别代表了上课和下课的时刻。
- 在
pandas
中称为Timestamp
- 一系列的时间戳可以组成
DatetimeIndex
,而将它放到Series
中后,Series
的类型就变为了datetime64[ns]
,如果有涉及时区则为datetime64[ns, tz]
,其中tz
是timezone
的简写。
- 在
- 时间差(Time deltas):即上课需要的时间
- 两个
Timestamp
做差就得到了时间差,pandas
中利用Timedelta
来表示。 - 类似的,一系列的时间差就组成了
TimedeltaIndex
, 而将它放到Series
中后,Series
的类型就变为了timedelta64[ns]
- 两个
- 时间段(Time spans):即在8点到10点这个区间都会持续地在上课
- 在
pandas
利用Period
来表示。 - 类似的,一系列的时间段就组成了
PeriodIndex
, 而将它放到Series
中后,Series
的类型就变为了Period
。
- 在
- 日期偏置(Date offsets):假设你只知道9月的第一个周一早上8点要去上课,但不知道具体的日期,那么就需要一个类型来处理此类需求
pandas
中的DateOffset
- 同时,
pandas
中没有为一列时间偏置专门设计存储类型,一般来说我们只需要对一批时间特征做一个统一的特殊日期偏置。
概念 | 单元素类型 | 数组类型 | pandas数据类型 |
---|---|---|---|
Date times | Timestamp | DatetimeIndex | datetime64[ns] |
Time deltas | Timedelta | TimedeltaIndex | timedelta64[ns] |
Time spans | Period | PeriodIndex | period[freq] |
Date offsets | DateOffset | None | None |
2 时间戳
2.1 Timestamp的构造与属性
pd.Timestamp
函数:单个时间戳的生成利用此函数实现- 通过
year, month, day, hour, min, second
可以获取具体的数值 - 【例子】
ts = pd.Timestamp('2020/1/1') ts # Timestamp('2020-01-01 00:00:00') ts = pd.Timestamp('2020-1-1 08:10:30') ts # Timestamp('2020-01-01 08:10:30')
ts.year # 2020 ts.second # 30
- 通过
- 时间戳的表示范围: 在
pandas
中,时间戳的最小精度为纳秒ns
,由于使用了64位存储,可以表示的时间范围大约可以如下计算:
Time Range = 2 64 1 0 9 × 60 × 60 × 24 × 365 ≈ 585 ( =\frac{2^{64}}{10^{9} \times 60 \times 60 \times 24 \times 365} \approx 585( =109×60×60×24×365264≈585( Years ) ) )
通过pd.Timestamp.max
和pd.Timestamp.min
可以获取时间戳表示的范围:pd.Timestamp.max # Timestamp('2262-04-11 23:47:16.854775807') pd.Timestamp.min # Timestamp('1677-09-21 00:12:43.145225') pd.Timestamp.max.year - pd.Timestamp.min.year # 585
2.2 Datetime序列的生成
to_datetime
函数:能够把一列时间戳格式的对象转换成为datetime64[ns]
类型的时间序列- 在极少数情况,时间戳的格式不满足转换时,可以强制使用
format
进行匹配 - 【例子】
pd.to_datetime(['2020-1-1', '2020-1-3', '2020-1-6']) # DatetimeIndex(['2020-01-01', '2020-01-03', '2020-01-06'], dtype='datetime64[ns]', freq=None) temp = pd.to_datetime(['2020\\1\\1','2020\\1\\3'],format='%Y\\%m\\%d') temp # DatetimeIndex(['2020-01-01', '2020-01-03'], dtype='datetime64[ns]', freq=None)
注意:上面由于传入的是列表,而非
pandas
内部的Series
,因此返回的是DatetimeIndex
,如果想要转为datetime64[ns]
的序列,需要显式用Series
转化pd.Series(temp).head() ''' 0 2020-01-01 1 2020-01-03 dtype: datetime64[ns] '''
- 还存在一种把表的多列时间属性拼接转为时间序列的
to_datetime
操作,此时的列名必须和以下给定的时间关键词列名一致
df_date_cols = pd.DataFrame({ 'year': [2020, 2020], 'month': [1, 1], 'day': [1, 2], 'hour': [10, 20], 'minute': [30, 50], 'second': [20, 40]}) pd.to_datetime(df_date_cols
- 在极少数情况,时间戳的格式不满足转换时,可以强制使用