时间信息在数据分析中的应用

  • 日期和时间数据类型
  • 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)

数据分析日期格式转换_数据分析日期格式转换_02


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))

数据分析日期格式转换_数据分析_03


通过date、time和datetime的方法我们可以创建日期和时间信息,而通过year、month、day、hour、minute、second属性,又可以获取到相应的日期或者时间的值。

在datetime中,还有一个可以获取当前时间的方法:

import datetime
# 获取当前时间
print(datetime.datetime.now())

数据分析日期格式转换_python_04


现在我们已经知道了如何使用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))

数据分析日期格式转换_数据分析_05


这个方法确实可行。但是如果我们想要产生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)

数据分析日期格式转换_python_06


是不是很神奇呢?其实这个变化的关键主要在于这句代码:

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)

数据分析日期格式转换_数据挖掘_07

注意到了吗?无论原来的连接符是什么转化过后都是“-”,但是一定要注意按一定的格式对应,如果写成%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]))

数据分析日期格式转换_python_08


这两种方法都满足了我们的要求,不过大家需要注意一下输出数据的类型哦~

如果我们肯需要对.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)

数据分析日期格式转换_数据_09

时间序列在表格中的应用

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)

数据分析日期格式转换_python_10


那么,对这个表格该如何去值呢?其实,时间序列作为索引的话检索是很灵活的,我们可以用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'])

数据分析日期格式转换_python_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'])

数据分析日期格式转换_数据分析日期格式转换_12


是不是和刚才一样呢?取值方式之前讲过,这里也同样适用,因此不过多展示。

有的文件中,时间信息是以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))

数据分析日期格式转换_数据挖掘_13


当然,如果字符串中的连接符不是“-”,我们可以做以下操作:

date=pd.to_datetime('2022*1/10日 00.00',format='%Y*%m/%d日 %H.%M')
print(date)

数据分析日期格式转换_数据_14


这次的分享就到此结束了。这一节我们学会了如何处理时间数据,包括产生时间数据,转化时间数据类型,将时间数据作为索引存储到表格中,以及对索引为时间数据的表格进行取值。希望读到此处的大家能有所收获~