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
属性 | 说明 |
---|---|
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 | 逻辑判断是不是日期所在年是不是闰年 |
上述方法只适用于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.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)