时间构造函数
构造时间,datetime.datetime包
直接用datetime包,如下图pd.datetime未来会取消
datetime.datetime.now(),生成现在的时间
可以访问具体的时分秒
strftime()
可以格式化时间字符串
时间戳pd.Timestamp()和时间段 pd.Period()
- 时间戳是最基本的时间序列数据,用于把数值与时点关联在一起。Pandas 对象通过时间戳调用时点数据。
pd.Timestamp
创建一个普通时间戳ps.date_range()
创建一个具有频率的时间戳
ps.Period()
表示一个时间段,而不是一个具体的时间点。- 也可以使用
pd.Period
来创建一个时间段,并指定频率。
- 也可以使用
构造时间序列date_range\bdate_range()
- 如果时间戳是定频的,用date_range()与bdate_range()函数即可创DatetimeIndex。
- date_range 默认的频率是日历日,bdate_range 的默认频率是工作日
freq参数可选字段
别名 | 偏移量类型 | 说明 |
---|---|---|
D | Day | 每日历日 |
B | Business Day | 每工作日 |
H | Hour | 每小时 |
T或min | Minute | 每分 |
S | Second | 每秒 |
L或ms | Milli | 每毫秒(千分之一秒) |
U | Micro | 每微秒(百万分之一秒) |
M | MonthEnd | 每月最后一个日历日 |
BM | BusinessMonthEnd | 每月最后一个工作日 |
MS | MonthBegin | 每月第一个日历日 |
BMS | BusinessMonthBegin | 每月第一个工作日 |
- 不过,大多数情况下,用时间段改变变量更自然。Period 表示的时间段更直观,还可以用日期时间格式的字符串进行推断。
- Timestamp 与 Period 可以用作索引。作为索引的 Timestamp 与 Period 列表则被强制转换为对应的 DatetimeIndex 与 PeriodIndex
转换时间戳
to_datetime()
- to_datetime 函数用于转换字符串、纪元式及混合的日期 Series 或日期列表。
- to_datetime 转换单个字符串时,返回的是单个 Timestamp。
- 解析欧式日期(日-月-年),要用 dayfirst 关键字参数:
- Timestamp 仅支持字符串输入,不支持 dayfirst、format 等字符串解析选项,如果要使用这些选项,就要用 to_datetime
DatetimeIndex构造
无效数据
不可解析时,默认值 errors='raise' 会触发错误:
errors = 'ignore'
返回原始输入,还是字符串格式
- errors='coerce' 把无法解析的数据转换为 NaT,即不是时间(Not a Time):
- 自定义格式处理函数
时间索引访问
常规时间索引访问
DatetimeIndex 可以当作常规索引,支持选择、切片等方法。
局部字符串索引
- 能解析为时间戳的日期与字符串可以作为索引的参数
- pandas 为访问较长的时间序列提供了便捷方法,年、年月字符串均可
- 带 DatetimeIndex 的 DateFrame 也支持这种切片方式。局部字符串是标签切片的一种形式,这种切片也包含截止时点,即,与日期匹配的时间也会包含在内
- 举个栗子
日期/时间属性
- 以下日期/时间属性可以访问 Timestamp 或 DatetimeIndex对象。
属性 | 说明 |
---|---|
year | datetime 的年 |
month | datetime 的月 |
day | datetime 的日 |
hour | datetime 的小时 |
minute | datetime 的分钟 |
second | datetime 的秒 |
microsecond | datetime 的微秒 |
nanosecond | datetime 的纳秒 |
date | 返回 datetime.date(不包含时区信息) |
time | 返回 datetime.time(不包含时区信息) |
timetz | 返回带本地时区信息的 datetime.time |
dayofyear | 一年里的第几天 |
weekofyear | 一年里的第几周 |
week | 一年里的第几周 |
dayofweek | 一周里的第几天,Monday=0, Sunday=6 |
weekday | 一周里的第几天,Monday=0, Sunday=6 |
weekday_name | 这一天是星期几 (如,Friday) |
quarter | 日期所处的季节:Jan-Mar = 1,Apr-Jun = 2 等 |
days_in_month | 日期所在的月有多少天 |
is_month_start | 逻辑判断是不是月初(由频率定义) |
is_month_end | 逻辑判断是不是月末(由频率定义) |
is_quarter_start | 逻辑判断是不是季初(由频率定义) |
is_quarter_end | 逻辑判断是不是季末(由频率定义) |
is_year_start | 逻辑判断是不是年初(由频率定义) |
is_year_end | 逻辑判断是不是年末(由频率定义) |
is_leap_year | 逻辑判断是不是日期所在年是不是闰年 |
pandas对象的dt属性
- Series对象和DataFrame的列数据提供了dt属性接口(accessors),对应日期时间数据,通过这个接口可以快速实现特定的功能,非常快捷。
- 可以用于提取时间里的年月日等等
- 现将时间转换为datetime格式,在使用dt属性
python
df_abs['salesday'] = pd.to_datetime(df_abs['salesday'] )
df_abs['year'] = df_abs['salesday'].dt.year
df_abs['month'] = df_abs['salesday'].dt.month
df_abs['week'] = df_abs['salesday'].dt.week
df_abs['ym'] = df_abs['salesday'].dt.strftime(('%Y-%m'))
df_abs['yw'] = df_abs['salesday'].dt.strftime(('%Y-%U'))
df_abs['day_of_week'] = df_abs['salesday'].dt.day_of_week
df_abs.loc[:,['salesday','year','month','week','ym','yw','day_of_week']].head()
重采样
Pandas 有一个虽然简单,但却强大、高效的功能,可在频率转换时执行重采样,如,将秒数据转换为 5 分钟数据,这种操作在金融等领域里的应用非常广泛。
resample() 是基于时间的分组操作,每个组都遵循归纳方法。
从 0.18.0 版开始,resample() 可以直接用于 DataFrameGroupBy 对象,
注意:重采样一定要以时间类型做Index
resample 函数非常灵活,可以指定多种频率转换与重采样参数。
支持聚合函数的处理如: sum、mean、std、sem、max、min、mid、median
时间差
- 以时间差为数据的 Series 与 DataFrame 支持各种运算,datetime64 [ns] 序列或 Timestamps 减法运算生成的是timedelta64 [ns] 序列。