Pandas的datetime数据类型(一)+https://developer.aliyun.com/article/1543824?spm=a2c6h.13148508.setting.19.1fa24f0esOqb0u
日期运算和Timedelta
Ebola数据集中的Day列表示一个国家爆发Ebola疫情的天数。这一列数据可以通过日期运算重建该列 疫情爆发的第一天(数据集中最早的一天)是2014-03-22。
计算疫情爆发的天数时,只需要用每个日期减去这个日期即可
获取疫情爆发的第一天 ebola['Date'].min() 添加新列 ebola['outbreak_d'] = ebola['Date']-ebola['Date'].min() 查看数据 ebola[['Date','Day','outbreak_d']].head() ebola[['Date','Day','outbreak_d']].tail()
banks['倒闭的季度'] = banks['Closing Date'].dt.quarter banks['倒闭的年份'] = banks['Closing Date'].dt.year
.dt.quarter和.dt.year可以获取当前日期的季度和年份
d=pd.Timestamp(2023,12,30) d.weekday()
closing_year = banks.groupby(['倒闭的年份'])['Bank Name'].count() closing_year 2000,2 2001,4 2002,11 2003,3 2004,4 2007,3 2008,25 2009,140 2010,157 2011,92
基于日期数获取数据子集
先将第一列数据处理为datetime类型
tesla = pd.read_csv(r'C:\Users\Administrator\Documents\WeChat Files\wxid_mgaxcaeufcpq22\FileStorage\File\2023-12\TSLA.csv',parse_dates=[0]) tesla.info()
tesla.loc[(tesla.Date.dt.year==2015) & (tesla.Date.dt.month == 8)]
将索引设为Date 列,然后可以查询2015年8月的所有数据
tesla.set_index('Date',inplace=True) tesla['2015-08']
tesla['ref_date'] = tesla['Date']-tesla['Date'].min() tesla.set_index('ref_date',inplace=True) tesla.loc['1000 days']
日期范围
使用date_range函数来创建连续的日期范围
head_range = pd.date_range(start='2014-12-31',end='2015-01-05') head_range # 使用date_range函数创建日期序列时,可以传入一个参数freq,默认情况下freq取值为D,表示日期范围内的值是逐日递增的 DatetimeIndex(['2014-12-31', '2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04', '2015-01-05'], dtype='datetime64[ns]', freq='D')
含日期的数据集中,并非每一个都包含固定频率。比如在Ebola数据集中,日期并没有规律 ebola.iloc[:,:5]
从上面的数据中可以看到,缺少2015年1月1日,2014年3月23日,如果想让日期连续,可以创建一个日期范围来为数据集重建索引。
在freq传入参数的基础上,可以做一些调整 pd.date_range('2023-01-01','2023-01-07',freq='2B’) freq传入的参数可以传入多个 pd.date_range('2023-01-01','2023-12-31',freq='WOM-1THU’) pd.date_range('2023-01-01','2023-12-31',freq='WOM-3FRI')
datetime类型案例
加载数据 crime = pd.read_csv('data/crime.csv',parse_dates=['REPORTED_DATE’]) 查看数据 crime.info() 设置报警时间为索引 crime = crime.set_index('REPORTED_DATE') crime.head()
crime.loc['2016-05-12’] 查看某一段时间的犯罪记录 crime.loc['2015-3-4':'2016-1-1'].sort_index() 时间段可以包括小时分钟 crime.loc['2015-3-4 22':'2016-1-1 23:45:00'].sort_index()查询凌晨两点到五点的报警记录 crime.between_time('2:00', '5:00', include_end=False)
查看发生在某个时刻的犯罪记录 crime.at_time('5:47’) 在按时间段选取数据时,可以将时间索引排序,排序之后再选取效率更高 crime_sort = crime.sort_index() %timeit crime.loc['2015-3-4':'2016-1-1’] %timeit crime_sort.loc['2015-3-4':'2016-1-1’] (%timeit是ipython的魔术函数,可用于计时特定代码段)
总结:
Pandas中,datetime64用来表示时间序列类型
时间序列类型的数据可以作为行索引,对应的数据类型是DatetimeIndex类型
datetime64类型可以做差,返回的是Timedelta类型