pandas库继承了NumPy库的datetime64以及timedelta64模块,能够快速实现时间字符串的转换、信息提取和时间运算。
类名称 | 说明 |
Timestamp | 最基础的时间类。表示某个时间点。绝大多数时间数据都是Timestamp形式 |
Timedelta | 表示不同单位的时间,例如1d、1.5h、3min、4s等,而非具体的某个时间段 |
TimedeltaIndex | 一组Timedelta构成的Index,可以用来作为Serise(DataFrame的单列数据为一个Series)或者DataFrame的索引 |
Period | 表示单个时间跨度,或某个时间段,例如某一天、某一小时等 |
DatetimeIndex |
一组Timestamp构成的Index,可以用来作为Series或者DataFrame的索引。 |
PeriodtimeIndex |
一组Period构成的Index,可以用来作为Series或者DataFrame的索引。 |
Timestamp类型
Ø其中Timestamp作为时间类中最基础的,也是最为常用的。在多数情况下,时间相关的字符串都会转换成为Timestamp。pandas提供了to_datetime函数,能够实现这一目标。(注意:读取的数据存在当前目录同级的data文件夹下)
import pandas as pd
#读取数据 更新表和登陆信息表
Log=pd.read_table('./data/Training_LogInfo.csv',sep=',',encoding='gbk') #./当前目录
Update=pd.read_csv('./data/Training_Userupdate.csv',sep=',',encoding='gbk')
#print(Log)
#print(Update)
# 登陆表 转换字符串时间为标准时间
print('转换前时间类型:\n',Log['Listinginfo1'].dtypes)
Log['Listinginfo1']=pd.to_datetime(Log['Listinginfo1'])
print('转换后时间类型:\n',Log['Listinginfo1'].dtypes)
print(Log['Listinginfo1'])
输出结果:
转换前时间类型:
object
转换后时间类型:
datetime64[ns]
0 2014-03-05
1 2014-03-05
2 2014-03-05
3 2014-03-05
4 2014-03-05
5 2014-03-05
6 2014-03-05
7 2014-03-05
8 2014-03-05
9 2014-03-05
...
580550 2014-03-05
Name: Listinginfo1, Length: 580551, dtype: datetime64[ns]
Ø值得注意的是,Timestamp类型时间是有限制的。
import pandas as pd
print('最小时间为:',pd.Timestamp.min)
print('最大时间为:',pd.Timestamp.max)
输出结果:
最小时间为: 1677-09-21 00:12:43.145225
最大时间为: 2262-04-11 23:47:16.854775807
DatetimeIndex与PeriodIndex函数
参数名称 |
说明 |
data |
接收array。表示DatetimeIndex的值。无默认。 |
freq |
接收string。表示时间的间隔频率。无默认。 |
start |
接收string。表示生成规则时间数据的起始点。无默认。 |
periods |
表示需要生成的周期数目。无默认。 |
end |
接收string。表示生成规则时间数据的终结点。无默认。 |
tz |
接收timezone。表示数据的时区。默认为None。 |
name |
接收int,string。默认为空。指定DatetimeIndex的名字。 |
时间字符串转化为DatetimeIndex与PeriodIndex(后面涉及提取DatetimeIndex和PeriodIndex中的数据)
dateIndex=pd.DatetimeIndex(Log['Listinginfo1'])
print('转换后的数据类型为:\n',type(dateIndex))
转换后的数据类型为:
转换为PeriodIndex的时候需要注意,需要通过freq参数指定时间间隔,常用的时间间隔有Y为年,M为月,D为日,H为小时,T为分钟,S为秒。两个函数可以用来转换数据还可以用来创建时间序列数据,其参数非常类似。
periodIndex=pd.PeriodIndex(Log['Listinginfo1'],freq='S')
print('转换periodIndex后的数据类型为:\n',type(periodIndex))
转换后的数据类型为:
Timestamp类常用属性
属性名称 |
说明 |
属性名称 |
说明 |
year |
年 |
week |
一年中第几周 |
month |
月 |
quarter |
季度 |
day |
日 |
weekofyear |
一年中第几周 |
hour |
小时 |
dayofyear |
一年中的第几天 |
minute |
分钟 |
dayofweek |
一周第几天 |
second |
秒 |
weekday |
一周第几天 |
date |
日期 |
weekday_name |
星期名称 |
time |
时间 |
is_leap_year |
是否闰年 |
提取数据:
#提取年份
year1=[i.year for i in Log['Listinginfo1']]
print('Listinginfo1中年份的前10个为:',year1[:10])
#提取月份
month1=[i.month for i in Log['Listinginfo1']]
print('Listinginfo1中月份的前10个为:',month1[:10])
#提取日期
day1=[i.day for i in Log['Listinginfo1']]
print('Listinginfo1中日期的前10个为:',day1[:10])
#一年中第几周
week_n=[i.week for i in Log['Listinginfo1']]
print('Listinginfo1中一年中第几周前10个为:',week_n[:10])
结果:
Listinginfo1中年份的前10个为: [2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014]
Listinginfo1中月份的前10个为: [3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
Listinginfo1中日期的前10个为: [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
Listinginfo1中一年中第几周前10个为: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
在DatetimeIndex和PeriodIndex中提取信息
在DatetimeIndex和PeriodIndex中提取对应信息可以以类属性方式实现。
值得注意的是PeriodIndex相比于DatetimeIndex少了weekday_name属性,所以不能够用该属性提取星期名称数据。若想要提取信息名称可以通过提取weekday属性,而后将0-6四个标签分别赋值为Monday至Sunday
#在DatetimeIndex和PeriodIndex中提取信息
print('dateIndex中星期名称的前5个为:\n',dateIndex.weekday_name[:5])
print('periodIndex中的星期名称的前5个为:\n',periodIndex.weekday[:5])
输出结果:
dateIndex中星期名称的前5个为:
Index(['Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday'], dtype='object', name='Listinginfo1')
periodIndex中的星期名称的前5个为:
Int64Index([2, 2, 2, 2, 2], dtype='int64', name='Listinginfo1')
Timedelta类
Timedelta是时间相关的类中的一个异类,不仅能够使用正数,还能够使用负数表示单位时间,例如1秒,2分钟,3小时等。使用Timedelta类,配合常规的时间相关类能够轻松实现时间的算术运算。目前Timedelta函数中时间周期中没有年和月。所有周期名称,对应单位及其说明如下表所示。
使用Timedelta ,可以很轻松地实现在某个时间上加减一段时间 。
#加运算 Timedelta
time1=Log['Listinginfo1']+pd.Timedelta(days=1) #将Listinginfo1列时间加1天
print(Log['Listinginfo1'][:5])
print("加一天后:\n",time1[:5])
#减运算 Timedelta
time2=Log['Listinginfo1']-pd.to_datetime('1995-12-4') #将Listinginfo1列时间加1天
print(Log['Listinginfo1'][:5])
print("减去1995-12-4后:\n",time2[:5])
结果:
0 2014-03-05
1 2014-03-05
2 2014-03-05
3 2014-03-05
4 2014-03-05
Name: Listinginfo1, dtype: datetime64[ns]
加一天后:
0 2014-03-06
1 2014-03-06
2 2014-03-06
3 2014-03-06
4 2014-03-06
Name: Listinginfo1, dtype: datetime64[ns]
0 2014-03-05
1 2014-03-05
2 2014-03-05
3 2014-03-05
4 2014-03-05
Name: Listinginfo1, dtype: datetime64[ns]
减去1995-12-4后:
0 6666 days
1 6666 days
2 6666 days
3 6666 days
4 6666 days
Name: Listinginfo1, dtype: timedelta64[ns]
除了使用Timedelta实现时间的平移外,还能够直接对两个时间序列进行相减,从而得出一个Timedelta。
Update=pd.read_csv('./data/Training_Userupdate.csv',sep=',',encoding='gbk')
#更新表 转换字符串时间为标准时间
Update['ListingInfo1']=pd.to_datetime(Update['ListingInfo1'])
Update['UserupdateInfo2']=pd.to_datetime(Update['UserupdateInfo2'])
#用户更新表表中两时间序列差
Update_c=Update['ListingInfo1']-Update['UserupdateInfo2']
print(Update_c)
结果:
0 13 days
1 10 days
2 9 days
3 8 days
4 6 days
5 1 days
6 13 days
7 13 days
8 13 days
9 13 days
10 13 days
11 13 days
12 13 days
13 13 days
14 10 days
15 9 days
16 8 days
17 6 days
...
580549 0 days
580550 0 days
Length: 580551, dtype: timedelta64[ns]
整合后的代码:
#1.1 时间字符串和标准时间的转换方法
import pandas as pd
#读取数据 更新表和登陆信息表
Log=pd.read_table('./data/Training_LogInfo.csv',sep=',',encoding='gbk') #./当前目录
Update=pd.read_csv('./data/Training_Userupdate.csv',sep=',',encoding='gbk')
#print(Log)
#print(Update)
# 登陆表 转换字符串时间为标准时间
print('转换前时间类型:\n',Log['Listinginfo1'].dtypes)
Log['Listinginfo1']=pd.to_datetime(Log['Listinginfo1'])
print('转换后时间类型:\n',Log['Listinginfo1'].dtypes)
print(Log['Listinginfo1'])
Log['LogInfo3']=pd.to_datetime(Log['LogInfo3'])
print(Log['LogInfo3'].dtypes)
print(Log['LogInfo3'])
#更新表 转换字符串时间为标准时间
Update['ListingInfo1']=pd.to_datetime(Update['ListingInfo1'])
Update['UserupdateInfo2']=pd.to_datetime(Update['UserupdateInfo2'])
print(Update['ListingInfo1'].dtypes)
print(Update['UserupdateInfo2'].dtypes)
print(Update['UserupdateInfo2'])
print(Update['ListingInfo1'])
#提取时间数据 登陆表
#提取年份
year1=[i.year for i in Log['Listinginfo1']]
print('Listinginfo1中年份的前10个为:',year1[:10])
#提取月份
month1=[i.month for i in Log['Listinginfo1']]
print('Listinginfo1中月份的前10个为:',month1[:10])
#提取日期
day1=[i.day for i in Log['Listinginfo1']]
print('Listinginfo1中日期的前10个为:',day1[:10])
#一年中第几周
week_n=[i.week for i in Log['Listinginfo1']]
print('Listinginfo1中一年中第几周前10个为:',week_n[:10])
#时间字符串转化为DatetimeIndex与PeriodIndex
dateIndex=pd.DatetimeIndex(Log['Listinginfo1'])
print('转换后的数据类型为:\n',type(dateIndex))
#转换为PeriodIndex的时候需要注意,需要通过freq参数指定时间间隔,
# 常用的时间间隔有Y为年,M为月,D为日,H为小时,T为分钟,S为秒
periodIndex=pd.PeriodIndex(Log['Listinginfo1'],freq='S')
print('转换periodIndex后的数据类型为:\n',type(periodIndex))
#在DatetimeIndex和PeriodIndex中提取信息
print('dateIndex中星期名称的前5个为:\n',dateIndex.weekday_name[:5])
print('periodIndex中的星期名称的前5个为:\n',periodIndex.weekday[:5])
#时间数据的算数运算
#加运算 Timedelta
time1=Log['Listinginfo1']+pd.Timedelta(days=1) #将Listinginfo1列时间加1天
print(Log['Listinginfo1'][:5])
print("加一天后:\n",time1[:5])
#减运算 Timedelta
time2=Log['Listinginfo1']-pd.to_datetime('1995-12-4') #将Listinginfo1列时间加1天
print(Log['Listinginfo1'][:5])
print("减去1995-12-4后:\n",time2[:5])
#用户登陆表中两时间序列差
Log_c=Log['Listinginfo1']-Log['LogInfo3']
print(Log_c)
#用户更新表表中两时间序列差
Update_c=Update['ListingInfo1']-Update['UserupdateInfo2']
print(Update_c)
#值得注意的是,Timestamp类型时间是有限制的。
print('最小时间为:',pd.Timestamp.min)
print('最大时间为:',pd.Timestamp.max)