内容大纲
- 日期类型处理
- 获取日期中不同部分
- 日期运算
- 日期索引
- 生成日期时间序列
- 数据可视化介绍
- Matplotlib API介绍
- 直方图
- 散点图
1.Pandas日期时间类型简介
-
概述
- 和其它语言类似, Python内置了datetime对象,可以在datetime库中找到
- pandas的日期时间类型默认是 datetime64[ns]
-
实例代码
-
Python中的-日期时间类型
# 导包 from datetime import datetime # 这个是原生Python包的内容 import pandas as pd # 场景1: 演示Python中的 日期时间类型 # 1. 获取当前时间 t1 = datetime.now() t1 # datetime.datetime(2024, 4, 26, 20, 6, 8, 677626) # 2. 可以手动设置日期. t2 = datetime(2024, 5, 1) t2 # datetime.datetime(2024, 5, 1, 0, 0) # 3. 计算两个日期差. t2 - t1 # datetime.timedelta(days=4, seconds=13935, microseconds=831597)
-
Pandas中的-日期时间类型
# 1. 加载: 疫情期间的 埃博拉数据. ebola = pd.read_csv('data/country_timeseries.csv') ebola.head() # 2. 查看每列详情. ebola.info() # 发现 Date是object(字符串类型)的 # 3. 把Date列转成 datetime类型的时间, 并添加到 ebola这个df对象中. ebola['date_df'] = pd.to_datetime(ebola['Date']) # 4. 再次查看 ebola 这个df对象的列信息. # 发现 date_df列 是 datetime64[ns]日期类型(可以精确到纳秒, 准不准就是另一回事儿了) ebola.info() # pandas 中默认的日期时间类型就是 datetime64[ns] # 5. 也可以通过如下的函数, 直接封装日期时间类对象. # 这个是: 日期时间戳 对象 pd.Timestamp(2024, 5, 1) # Timestamp('2024-05-01 00:00:00') # 这个是: 日期时间 对象. pd.datetime(2024, 5, 1) # datetime.datetime(2024, 5, 1, 0, 0), 结果是python的日期类型 # 6. pandas支持, 读取文件数据的时候, 把指定列转成日期列. # 写列名 或者 写列的索引均可, 但是需要传入: 列表形式的数据, 因为可能要转换的列有多列. ebola = pd.read_csv('data/country_timeseries.csv', parse_dates=['Date']) # ebola = pd.read_csv('data/country_timeseries.csv', parse_dates=[0]) ebola.info()
-
2.日期时间类型-获取日期中不同部分
# 1. 获取日期时间类型的 对象.
time_stamp = pd.to_datetime('2024-05-13') # 把字符串转成 Timestamp类型.
time_stamp # panda的日期时间类型(时间戳)
# 2. 获取年
time_stamp.year
time_stamp.month
time_stamp.day
time_stamp.dayofyear # 年中第几天
# 3. 获取埃博拉数据的年, 月, 日.
# .dt 是把Series对象转成 DatetimeProperties 对象, 然后就能获取不同的时间了.
ebola['year'] = ebola['Date'].dt.year
ebola['month'] = ebola['Date'].dt.month
ebola['day'] = ebola['Date'].dt.day
# 4. 查看ebola数据
ebola.info()
3.日期时间类型-日期运算
-
案例1: 埃博拉数据演示
# 1. 计算各个国家, 疫情爆发的天数 # 埃博拉数据中, Day表示各个国家, 疫情爆发的时间(第几天) ebola['Date'] - ebola['Date'].min() # 2. 给ebola这个df对象新增一列, 表示: 疫情天数, 即: 日期 - 爆发的哪一天 ebola['outbreak_d'] = ebola['Date'] - ebola['Date'].min() # 3. 查看数据 ebola.head() ebola.info() # 能看到 outbreak_d 列为: timedelta64[ns] (日期差类型)
-
案例2: 银行数据演示
# 1. 加载银行数据, 把最后两列转为: 日期列 banks = pd.read_csv('data/banklist.csv', parse_dates=[5, 6]) banks.info() # 2. 计算银行倒闭的季度 和 年份, 并把该列值添加到 df中. banks['Closing_Quarter'], banks['Closing_Year'] = (banks['Closing Date'].dt.quarter, banks['Closing Date'].dt.year) banks # 3. 统计每年倒闭的银行数. banks['Closing_Year'].value_counts() # 4. 计算每年, 每季度, 银行倒闭数. banks.groupby(['Closing_Year', 'Closing_Quarter']).size() # 统计长度(个数). banks.groupby(['Closing_Year', 'Closing_Quarter']).count() # 统计个数, 效果同上. # 透视表方式实现, 效果同上. banks.pivot_table(index=['Closing_Year', 'Closing_Quarter'], values='Bank Name', aggfunc='count') # 5. 可视化展示 banks.pivot_table(index=['Closing_Year', 'Closing_Quarter'], values='Bank Name', aggfunc='count').plot(grid=True)
4.日期时间索引
# 1. 加载特斯拉股票数据.
tesla_stock = pd.read_csv('data/TSLA.csv', parse_dates=[0])
tesla_stock
# 2. 查看该df的列信息
tesla_stock.info()
# 3. 获取开盘价, 最小值, 最大值
tesla_stock['Open'].min()
tesla_stock['Open'].max()
# 4. 获取2015年, 8月的数据
# 方式1: 不使用日期索引, df对象[(条件1) & (条件2)]
# & 支持 Series 和 Series的比较
# and 不支持 Series 和 Series的比较
tesla_stock[(tesla_stock['Date'].dt.year == 2018) & (tesla_stock['Date'].dt.month == 8)]
# 方式2: 使用日期索引实现.
tesla_stock.set_index('Date', inplace=True)
# tesla_stock
tesla_stock.loc['2015-08']
# tesla_stock['2015-08'] 这种写法在2.0的版本已经被删除了
# 还可以使用 timedelta 类型-时间差类型 实现.
tesla_stock['ref_date'] = tesla_stock['Date'] - tesla_stock['Date'].min()
# 把timedelta设置为 index
# tesla_stock.set_index('ref_date')
tesla_stock.index = tesla_stock['ref_date'] # 效果同上
# 查看数据
tesla_stock.head()
# 基于ref_date 来选择数据
tesla_stock['0 days' : '5 days']
# 注意: 切片方式获取数据, (切片列)要求是要有序的
tesla_stock['5 days' : '0 days'] # 获取不到数据.
# 这个可以获取到数据.
tesla_stock.sort_index(ascending=False)['5 days' : '0 days']
5.生成日期时间序列
-
格式
pd.date_range('起始时间','结束时间', freq= 生成时间序列的方式) # frequency:出现频次
-
参数
freq
可以取得值