时间信息在数据分析中的应用
- 日期和时间数据类型
- Pandas时间序列基础
- 时间序列在表格中的应用
- Series类型
- DataFrame类型
时间信息在现实应用中非常实用,在工程实践之中,比如关于时变信号的采样。此外,在物理学,金融、经济等领域,也都需要在多个时间点观测或者测量数据,这样就产生了关于时间序列的数据。
日期和时间数据类型
Python标准库包含了日期和时间数据的数据类型,datetime模块是一个关于时间的库,也是在处理时间数据中应用最广泛的一个模块。
datetime常用类:
类型 | 说明 |
date | 以公历形式存储日历日期(年、月、日) |
time | 将时间存储为时、分、秒 |
datetime | 存储日期和时间 |
下面我们尝试一下使用datetime对各个类型进行创建和获取:
1.date的使用
import datetime
# 创建时间信息
import datetime
# 创建时间信息
date = datetime.date(2022,1,10)
# 查看data的类型
print(type(date))
print(date)
# 获取年信息
print(date.year)
# 获取月信息
print(date.month)
# 获取日信息
print(date.day)
2.time的使用
import datetime
time = datetime.time(13, 14, 20)
# 查看time的类型
print(type(time))
print(time)
# 获取小时
print(time.hour)
# 获取分钟
print(time.minute)
# 获取秒
print(time.second)
datetime类型实际是date和time类型的结合体:
import datetime
# 创建日期时间
datetime = datetime.datetime(2021, 1, 10, 13, 14, 20)
# 查看datetime的类型
print(type(datetime))
print(datetime)
# 获取年
print(datetime.year)
print(type(datetime.year))
# 获取月
print(datetime.month)
print(type(datetime.month))
# 获取日
print(datetime.day)
print(type(datetime.day))
# 获取小时
print(datetime.hour)
print(type(datetime.hour))
# 获取分钟
print(datetime.minute)
print(type(datetime.minute))
# 获取秒
print(datetime.second)
print(type(datetime.second))
通过date、time和datetime的方法我们可以创建日期和时间信息,而通过year、month、day、hour、minute、second属性,又可以获取到相应的日期或者时间的值。
在datetime中,还有一个可以获取当前时间的方法:
import datetime
# 获取当前时间
print(datetime.datetime.now())
现在我们已经知道了如何使用datetime模块创建或获取时间信息了,但是有时候我们可能需要将datetime类型转换成字符串样式。因此我们就探讨一下如何将datetime类型转换成str类型。
首先,让我们试试简单的强制类型转换:
import datetime
date_time = datetime.datetime.now()
print(type(date_time))
str_date_time = str(date_time)
print(str_date_time)
print(type(str_date_time))
这个方法确实可行。但是如果我们想要产生10/1/2021 22:15样式的字符串,有没有什么方法可以满足此需求呢?
import datetime
date_time = datetime.datetime.now()
# 将2022-01-10 22:23:51.395484转换成01/10/2022 22:23样式的字符串
str_time = date_time.strftime('%m/%d/%Y %H:%M')
print(str_time)
是不是很神奇呢?其实这个变化的关键主要在于这句代码:
date_time.strftime('%m/%d/%Y %H:%M')
这里%m代表从数据中获取月份信息,%d代表从数据中获取日期信息,其他的格式符会附表说明。“/”代表各个数据之间使用/连接,当然也可以设置使用其他符号连接。
格式符汇总:
格式符 | 含义 | 格式符 | 含义 |
%a | 缩写工作日 | %M | 分钟 十进制数(00-59) |
%A | 完整的工作日 | %p | 当前语言环境的上午/下午指标12小时时钟 |
%b | 缩写月 | %S | 秒(0-59) |
%B | 全月 | %U | 周数为十进制数,周日为一周的第一天(0-51) |
%c | 日期和时间表示适用于地区 | %w | 工作日为十进制数(0-6;周日为0) |
%d | 以十进制数表示的月份日(01-31) | %W | 周数为十进制数,周日为一周的第一天(0-51) |
%H | 24小时格式(00-23) | %x | 当前区域设置的日期表示 |
%I | 12小时制(01-12小时) | %X | 当前语言环境的时间表示 |
%j | 以十进制数表示的年份 | %y | 没有世纪的年份,如十进制数(00-99) |
%m | 月,十进制数(01-12) | %Y | (年份)年与世纪,作为十进制数 |
%z,%Z | 时区名称或缩写;如果时区未知,则没有字符 |
利用这些格式符,就可以解决datetime转化成str这类的要求。同样,这些字符也可以帮助我们把str类型的时间信息转化成datetime类型:
import datetime
# Aug——月份缩写,转换要用%b
# 23——日期,转换用%d
# 19——没有世纪的年份,转换用%y
# 20——24小时格式,转换用%H
# 13——分钟,转换用%M
strp = datetime.datetime.strptime('Jan*10/22 23_30', '%b*%d/%y %H_%M')
'''
将str类型数据Jan*10/22 23_30转化为datetime类型
连接符要保证对应一致!
'''
print(strp)
注意到了吗?无论原来的连接符是什么转化过后都是“-”,但是一定要注意按一定的格式对应,如果写成%B*%d/%Y %H_%M ,或者%b -%d-%Y %H:%M就不能正常运行了。
Pandas时间序列基础
假如我们要收集从今往后14天的身体状况进行报备,要怎么生成时间序列呢?pandas也有对应的解决方法:
pd.date_range(start=None,end=None,periods=None,freq="D")
这是.date_range()方法和它的基本参数。其中,start和end分别表示日期范围的开始和结束,periods表示需要输出的时间信息数量,fre表示日期变化的步长,默认为一天(”D”)。接下来我们尝试用代码实现功能:
import pandas as pd
# 使用默认步长,依据起止日期生成时间序列
date= pd.date_range(start='20220110',end='20220123')
# 查看生成结果
print(date)
# 取值方式类似于列表
print(date[0])
# 查看date类型
print(type(date))
# 使用默认步长,依据起始日期配合需要的时间信息量生成序列
date= pd.date_range(start='20220110',periods=14)
print(date)
print(date[5])
# 查看取出的数据date[5]的类型
print(type(date[5]))
这两种方法都满足了我们的要求,不过大家需要注意一下输出数据的类型哦~
如果我们肯需要对.date_range()方法的日期变化的步长进行调整,比如十天,那么就可以将freq参数设置为“10D”。当然,频率不一定以天为单位:
频率的缩写:
别名 | 说明 |
D | 日历的每一天 |
B | 工作日的每天 |
H | 每小时 |
T或min | 每分钟 |
S | 每秒 |
L或ms | 每毫秒 |
U | 每微秒 |
M | 日历日的月底日期 |
BM | 工作日的月底日期 |
MS | 日历日的月初日期 |
BMS | 工作日的月初日期 |
那么我们尝试一下不用天作为步长吧:
date= pd.date_range(start='20220110',periods=10,freq="10D")
print(date)
date= pd.date_range(start='20220110',periods=10,freq="H")
print(date)
时间序列在表格中的应用
Series类型
假如现在我们需要一个1行30列的表格,列索引是时间信息,要怎么做到呢?
import pandas as pd
import numpy as np
time_index = pd.date_range('2022-01-10', periods=30)
# 构建30个随机数,形成一个行向量
time_data = np.random.randint(355,373,size=30)/10
date_time = pd.Series(data=time_data,index=time_index)
print(date_time)
那么,对这个表格该如何去值呢?其实,时间序列作为索引的话检索是很灵活的,我们可以用date_time[‘2022’]获取到所有年份为2022的数据,可以用date_time[‘2022-02’]获得所有2022年2月分的数据,也可以用date_time[‘2022-01-11’]获取2022年1月11日的所有数据:
print(date_time['2022'])
print(date_time['2022-02'])
print(date_time['2022-01-11'])
(注:第一句代码输出的内容和之前print(date_time)输出一致,这里不再展示)
DataFrame类型
话不多说,让我们直接尝试创建一个DataFrame类型:
import pandas as pd
import numpy as np
time_index = pd.date_range('2021-12-26', periods=14)
# 构建30个随机数,形成一个行向量
time_data = np.random.randint(350,383,size=(14,3))/10
body_temperature = pd.DataFrame(data=time_data,index=time_index,columns=['早','午','晚'])
print('查看体温检测表内容:')
print(body_temperature)
print('\n查看体温检测表2021年部分的内容:')
print(body_temperature.loc['2021'])
print('\n查看2022年1月5日到8日部分体温检测表内容:')
print(body_temperature.loc['2022-01-05':'2022-01-08'])
是不是和刚才一样呢?取值方式之前讲过,这里也同样适用,因此不过多展示。
有的文件中,时间信息是以str类型存储的,我们做可视化时需要将其转换成Timestamp格式,这个操作是批量的,可以使用to_datetime()方法实现:
pd.to_datetime(arg,format=None)
arg:需要修改的数据
format:数据的格式
如果我们还想将Timestamp格式转化为datetime格式,那就需要对Timestamp类型数据使用.to_pydatetime()方法:
import pandas as pd
date=pd.to_datetime('2022-01-05')
print(date,type(date))
date=date.to_pydatetime()
print(date,type(date))
当然,如果字符串中的连接符不是“-”,我们可以做以下操作:
date=pd.to_datetime('2022*1/10日 00.00',format='%Y*%m/%d日 %H.%M')
print(date)
这次的分享就到此结束了。这一节我们学会了如何处理时间数据,包括产生时间数据,转化时间数据类型,将时间数据作为索引存储到表格中,以及对索引为时间数据的表格进行取值。希望读到此处的大家能有所收获~