Pandas细节操作---时间序列(超详细3.0)

6 篇文章 0 订阅
3 篇文章 1 订阅

时间序列

1.pandas构造时间的函数

pandas与datetime() 与 python的datetime模块一致

import datetime
import pandas as pd
import numpy as np

now = datetime.datetime.now()
type(now) -> datetime.datetime

now1 = pd.datetime.now()
type(now1) -> datetime.datetime

# pd 和 python 的datetime类型完全一致。(但是datetime即将被移除pandas模块)



# 可以获取日期
now.date()     ->   datetime.date(2022, 4, 25)

# 可以获取时间
now.time()     ->    datetime.time(1, 33, 38, 435568)

# 转换格式
now.strftime('%Y.%m-%d')    ->  '2022.4.25'

2.时间戳pd.Timestamp 和 时间段pd.Period

时间戳是最基本的时间序列数据,用于把数值与时点关联在一起。Pandas 对象通过时间戳调用时点数据

ts = pd.Timestamp('2022-04-19 00:00:00', freq='D')   # 创建时间戳

ts   ->    Timestamp('2022-04-19 00:00:00', freq='D')

# 对时间戳进行加减运算。 (给定一个日期对该日期进行运算,之前可以直接 + 2  已经被废弃)
ts + pd.Timedelta(2,unit='D')   -> Timestamp('2022-04-21 00:00:00', freq='D')

freq参数的可选字符串

|别名| 偏移量类型| 说明| |-|-| |D | Day | 每日历日| |B | BusinessDay| 每工作日| |H | Hour |每小时| |T或min | Minute | 每分| |S |Second | 每秒 | |L或ms | Milli | 每毫秒(即每千分之一秒)| |U | Micro | 每微秒(即每百万分之一秒)| |M | MonthEnd | 每月最后一个日历日| |BM | BusinessMonthEnd | 每月最后一个工作日| |MS |MonthBegin | 每月第一个日历日| |BMS | BusinessMonthBegin | 每月第一个工作日

不过,大多数情况下,用时间段改变变量更自然。Period 表示的时间段更直观,还可以用日期时间格式的字符串进行推断。

时间戳和时间段都可以与整数做加减运算,以freq指定的参数为单位

Timestamp 与 Period 可以用作索引。作为索引的 Timestamp 与 Period 列表则被强制转换为对应的 DatetimeIndex 与 

​​​​​​​unit参数的可选字符串

不过,大多数情况下,用时间段改变变量更自然。Period 表示的时间段更直观,还可以用日期时间格式的字符串进行推断。

时间戳和时间段都可以与整数做加减运算,以freq指定的参数为单位

Timestamp 与 Period 可以用作索引。作为索引的 Timestamp 与 Period 列表则被强制转换为对应的 DatetimeIndex 与 PeriodIndex。

3.构造时间序列date_range\bdate_range()

  • 实际工作中,经常要生成含大量时间戳的超长索引,一个个输入时间戳又枯燥,又低效
  • 如果时间戳是定频的,用date_range()与bdate_range()函数即可创DatetimeIndex。
  • date_range 默认的频率是日历日,bdate_range 的默认频率是工作日

        1); pd.date_range()      # 构造一个时间序列,"start="表示起始时间,"end=“表示结束时                        间,"freq="  表示频率,"name="表示名称标签

        2);pd.bdate_range()     # 同上构建工作日时间序列,“freq=”默认值是B

 4.转换时间戳

to_datetime()  字符串转换成时间类型

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

时间类型的字符串,可以直接用to_datetime函数转换程Timestamp类型

非时间类型的转换方式

# 1.单个元素的转换

# 强制类型转换解决一个数据的临时转换
int('123')


# 2.多元素或数据批量
np.array([1,2,3]).astype(np.float64) 


#转换的是 Series时,返回的是具有相同的索引的Series,日期时间列表则会被转换为DatetimeIndex

pd.to_datetime()       #  参数"dayfirst=" 例如解析"09-01-2022",如果为dayfirst=True则表示把25解析成日输出则是“2022-01-09”,否则会解析成"2022-09-01".     dayfirst并没有那么严苛,如果不能把第一个数解析为日,就会以 dayfirst 为 False 进行解析。

参数"format=" 格式化输出(类型是Timestamp)

to_datetime 转换单个字符串时,返回的是单个 Timestamp。(时间戳)

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

5.DatetimeIndex构造

Pandas 还支持直接使用 DatetimeIndex 构建时间序列:

# Pandas 还支持直接使用 DatetimeIndex 构建时间序列:
pd.DatetimeIndex(['2018-01-01', '2018-01-3', '2018-01-05'])

# -> DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], dtype='datetime64[ns]', freq=None)

#  创建 DatetimeIndex 时,freq='infer' 可自动推断索引的频率freq='inder'->freq='2D'

time_indexes = pd.DatetimeIndex(['2018-01-01', '2018-01-3', '2018-01-05'], freq='infer')

# -> DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], dtype='datetime64[ns]', freq='2D')

6.提供格式参数format

要实现精准转换,除了传递 datetime 字符串,还可以通过format参数来指定格式,指定此参数还可以加速转换速度。

7. to_datetime() 中的errors参数作用

errors参数:作用是当to_datetime() 处理无效数据时是报错(errors='raise')还是放回原始值(errors='ignore‘),获取直接将无效数据转换为NaT(errors='coerce' )。

方法一,当需要转换数据出现无效数据时的几种处理办法:

pd.to_datetime(['2009/07/30', 'asd'], errors='raise')

1. 当有无效数据不可解析时,默认值 errors='raise' 会触发错误;

# 有错就要处理,使用默认值‘raise就会直接报错’,

2.当有无效数据不可解析时, 如果errors='ignore‘时它不会报错,会直接返回原数据类型

# errors='ignore' 返回原始输入:

3.当有无效数据不可解析时,如果 errors='coerce'时它不会报错,但是会把无效数据转换为NaT类型;

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

方法二,当有无效数据不可解析时,也可以pd.Series.map()函数在map里传入函数对数据进行预处理。

8.索引访问

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

局部字符串索引

能解析为时间戳的日期与字符串可以作为索引的参数;

pandas 为访问较长的时间序列提供了便捷方法,年、年月字符串均可;

带 DatetimeIndex 的 DateFrame 也支持这种切片方式。局部字符串是标签切片的一种形式,这种切片也包含截止时点,即,与日期匹配的时间也会包含在内;

日期/时间属性

以下日期/时间属性可以访问 Timestamp 或 DatetimeIndex对象。

datetime

属性说明
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逻辑判断是不是日期所在年是不是闰年

上述方法只适用于Timestimpe和 DatetimeIndex类型数据,而pandas里的Timestimpe和 DatetimeIndex类型不能适用。

pandas对象的dt属性

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

DataFrame['时间'].dt.year  # 接用dt后可以适用。

9.重采样

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

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

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

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

时间差

Timedelta() 支持用多种参数生成时间差:

 unit: Possible values:
    {'Y', 'M', 'W', 'D', 'days', 'day', 'hours', hour', 'hr', 'h',
    'm', 'minute', 'min', 'minutes', 'T', 'S', 'seconds', 'sec', 'second',
    'ms', 'milliseconds', 'millisecond', 'milli', 'millis', 'L',
    'us', 'microseconds', 'microsecond', 'micro', 'micros', 'U',
    'ns', 'nanoseconds', 'nano', 'nanos', 'nanosecond', 'N'}

**kwargs
    Available kwargs: {days, seconds, microseconds,
    milliseconds, minutes, hours, weeks}.
    Values for construction in compat with datetime.timedelta.
    Numpy ints and floats will be coerced to python ints and floats.

​​​​​​​

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值