Skip to content

时间构造函数

构造时间,datetime.datetime包

  • 直接用datetime包,如下图pd.datetime未来会取消

  • datetime.datetime.now(),生成现在的时间

  • 可以访问具体的时分秒

  • strftime()可以格式化时间字符串

image-20240421104011959

时间戳pd.Timestamp()和时间段 pd.Period()

  • 时间戳是最基本的时间序列数据,用于把数值与时点关联在一起。Pandas 对象通过时间戳调用时点数据。
  • pd.Timestamp创建一个普通时间戳
    • ps.date_range()创建一个具有频率的时间戳

image-20240421105947788

  • ps.Period()表示一个时间段,而不是一个具体的时间点。
    • 也可以使用 pd.Period 来创建一个时间段,并指定频率。

image-20240421110042774

构造时间序列date_range\bdate_range()

  • 如果时间戳是定频的,用date_range()与bdate_range()函数即可创DatetimeIndex。
  • date_range 默认的频率是日历日,bdate_range 的默认频率是工作日

image-20240421113440206

freq参数可选字段

别名偏移量类型说明
DDay每日历日
BBusiness Day每工作日
HHour每小时
T或minMinute每分
SSecond每秒
L或msMilli每毫秒(千分之一秒)
UMicro每微秒(百万分之一秒)
MMonthEnd每月最后一个日历日
BMBusinessMonthEnd每月最后一个工作日
MSMonthBegin每月第一个日历日
BMSBusinessMonthBegin每月第一个工作日
  • 不过,大多数情况下,用时间段改变变量更自然。Period 表示的时间段更直观,还可以用日期时间格式的字符串进行推断。
  • Timestamp 与 Period 可以用作索引。作为索引的 Timestamp 与 Period 列表则被强制转换为对应的 DatetimeIndex 与 PeriodIndex

转换时间戳

to_datetime()

  • to_datetime 函数用于转换字符串、纪元式及混合的日期 Series 或日期列表。

image-20240421115216879

image-20240421115317528

  • to_datetime 转换单个字符串时,返回的是单个 Timestamp。

image-20240421115704818

  • 解析欧式日期(日-月-年),要用 dayfirst 关键字参数:

image-20240421115452441

  • Timestamp 仅支持字符串输入,不支持 dayfirst、format 等字符串解析选项,如果要使用这些选项,就要用 to_datetime

image-20240421115829447

DatetimeIndex构造

image-20240421145729256

无效数据

不可解析时,默认值 errors='raise' 会触发错误:

image-20240421151752050

  • errors = 'ignore'返回原始输入,还是字符串格式

image-20240421151836363

  • errors='coerce' 把无法解析的数据转换为 NaT,即不是时间(Not a Time):

image-20240421152035770

  • 自定义格式处理函数

image-20240421152106221

时间索引访问

常规时间索引访问

DatetimeIndex 可以当作常规索引,支持选择、切片等方法。

image-20240421152927633

image-20240421152956790

局部字符串索引

  • 能解析为时间戳的日期与字符串可以作为索引的参数
  • pandas 为访问较长的时间序列提供了便捷方法,年、年月字符串均可
  • 带 DatetimeIndex 的 DateFrame 也支持这种切片方式。局部字符串是标签切片的一种形式,这种切片也包含截止时点,即,与日期匹配的时间也会包含在内

image-20240421153113153

image-20240421153141595

  • 举个栗子

image-20240421153219066

image-20240421154548065

日期/时间属性

  • 以下日期/时间属性可以访问 Timestamp 或 DatetimeIndex对象。
属性说明
yeardatetime 的年
monthdatetime 的月
daydatetime 的日
hourdatetime 的小时
minutedatetime 的分钟
seconddatetime 的秒
microseconddatetime 的微秒
nanoseconddatetime 的纳秒
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逻辑判断是不是日期所在年是不是闰年

image-20240421155329181

pandas对象的dt属性

  • Series对象和DataFrame的列数据提供了dt属性接口(accessors),对应日期时间数据,通过这个接口可以快速实现特定的功能,非常快捷。

image-20240421155423217

  • 可以用于提取时间里的年月日等等
    • 现将时间转换为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()

image-20240521132915299

重采样

  • Pandas 有一个虽然简单,但却强大、高效的功能,可在频率转换时执行重采样,如,将秒数据转换为 5 分钟数据,这种操作在金融等领域里的应用非常广泛。

  • resample() 是基于时间的分组操作,每个组都遵循归纳方法。

  • 从 0.18.0 版开始,resample() 可以直接用于 DataFrameGroupBy 对象,

  • 注意:重采样一定要以时间类型做Index

  • resample 函数非常灵活,可以指定多种频率转换与重采样参数。

  • 支持聚合函数的处理如: sum、mean、std、sem、max、min、mid、median

image-20240421160421307

image-20240421160448420

image-20240421160514570

image-20240421160548178

时间差

image-20240421160732541

  • 以时间差为数据的 Series 与 DataFrame 支持各种运算,datetime64 [ns] 序列或 Timestamps 减法运算生成的是timedelta64 [ns] 序列。

image-20240421160814660

image-20240421160841823