Pandas处理时间数据

您所在的位置:网站首页 excel如何显示年月日时分秒 Pandas处理时间数据

Pandas处理时间数据

2024-02-12 10:54| 来源: 网络整理| 查看: 265

Pandas主要涉及两种数据结构Series和DataFrame,Series相当于数组numpy.array类似,后者相当于有表格,有行表头index和列表头columns

介绍一下表格数据

看下图数据,这是一个爬虫下来的疫情的数据,数据特点:

同一天可能有多次更新的数据有可能会有一天没有数据,针对美国这种,前期数据基本不公布

需要做的处理:

希望每天仅保留最后一个时刻的数据作为当天最终结果对缺失的日期数据进行补充,即数据填充fill 在这里插入图片描述 一、读取表格数据read_csv

读取表格用的是pandas的read_csv函数

# -*- encoding: utf-8 -*- import pandas as pd objectname = r'E:/Project/Python/DateTime/data.csv' csv_orz = pd.read_csv(objectname, encoding='UTF-8') print(csv_orz.head(5)) print(type(csv_orz))

csv_orz 的数据类型是DataFrame 输出显示: 在这里插入图片描述

二、pandas时间数据

1、根据时间对数据进行排序

# 根据时间进行排序 DataSort = csv_orz.sort_values(by='updateTime',ascending=False) print(DataSort.head(5))

2、根据时间数据仅保留年月日,后面的时分秒就不用 (1)可以通过字符串slice来筛选时间数据

# 仅保留年月日 DataSort['updateTime'] = DataSort.updateTime.str.slice(0, 11) print(DataSort.head(5)) # 日期去重 DataSortDrop = DataSort.drop_duplicates(["updateTime"],keep="first") print(DataSortDrop.head(5))

输出的就是没有时分秒,再通过drop_duplicates把重复的去掉 在这里插入图片描述 (2)可以通过to_datetime转成时间格式,再用strftime来进行转换

DataSort['updateTime'] = pd.to_datetime(DataSort['updateTime'],format='%Y-%m-%d') DataSort['updateTime'] = DataSort['updateTime'].apply(lambda x:x.strftime('%Y-%m-%d')) print(DataSort.head(5))

其实第一个format=’%Y-%m-%d’没有什么作用,这个就不懂原因了,但是必须先用to_datetime转时间格式,否则是Series格式的,就没法调用strftime。

三、DataFrame数据拼接与填充 1、取第一行的数据,保存到变量DataFinal

取数据用iloc来取

DataFinal = DataSortDrop.iloc[0,:].to_frame().T print(DataFinal) firstDayTime = pd.to_datetime(DataFinal['updateTime'],format='%Y-%m-%d') print(firstDayTime) #'2020-03-24' # 生成一个时间格式的数据,表示一天 oneDay = pd.Timedelta(weeks=0,days=1,hours=0,minutes=0,seconds=0) firstDayTime = firstDayTime - oneDay

上面还建立了一个变量表示oneday,一天,因为时间数据之间的加减只能用时间格式的来处理,不能直接减数值1,所以要用Timedelta来处理

2、数据拼接

主要的思想:第二行的数据 nextDayTime 和前一行的数据 firstDayTime减oneday 进行比较,如果日期一致说明数据没有缺失,则用concat进行拼接上去,否则就填充的空行:

for i in range(1, len(DataSortDrop)): nextLineData = DataSortDrop.iloc[i,:].to_frame().T nextDayTime = pd.to_datetime(nextLineData['updateTime']) if(nextDayTime.values == firstDayTime.values): DataFinal = pd.concat([DataFinal, nextLineData], axis=0) firstDayTime = firstDayTime - oneDay else: while(firstDayTime.values != nextDayTime.values): data = {'updateTime':str(firstDayTime.values)[2:12]} emptynextData = pd.DataFrame(data,index=[i]) # print(emptynextData) DataFinal = pd.concat([DataFinal, emptynextData], axis=0) firstDayTime = firstDayTime - oneDay DataFinal = pd.concat([DataFinal, nextLineData], axis=0) firstDayTime = firstDayTime - oneDay # 数据填充用后一天的数据来做 CountryFinal = DataFinal.fillna(method='ffill')

(1)日期与日期之间的比较用value

if(nextDayTime.values == firstDayTime.values):

(2)通过字典的方式新建一个DataFrame数据

data = {'updateTime':str(firstDayTime.values)[2:12]} emptynextData = pd.DataFrame(data,index=[i])

(3)通过concat进行数据拼接,用 axis 设置行拼接或者列拼接,它可以自动对齐updateTime数据

DataFinal = pd.concat([DataFinal, nextLineData], axis=0) DataFinal = pd.concat([DataFinal, emptynextData], axis=0)

(4)数据填充,直接用后项填充,就是用前一天的数据补充空缺的数据

CountryFinal = DataFinal.fillna(method='ffill') 四、日期数据(扩)

这里是引用:https://www.cnblogs.com/nxf-rabbit75/p/10660317.html#auto_id_0

pandas的实际类型主要分为: timestamp(时间戳)period(时期)timedelta(时间间隔) 常用的日期处理函数有: pd.to_datetime()pd.to_period()pd.date_range()pd.period_rangeresample 1、pd.Timestamp()时间戳 #定义timestamp t1=pd.Timestamp('2019-01-10') t2=pd.Timestamp('2018-12-10') print(f't1= {t1}') print(f't2= {t2}') print(f't1与t2时间间隔:{(t1-t2).days}天') #获取当前时间 now=pd.datetime.now() print(now) print(now.strftime('%Y-%m-%d'))

输出结果: 在这里插入图片描述

2、pd.Timedelta()实现datetime加减

对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+和-运算符,不过需要导入timedelta这个类:

#时间间隔 timeTmp = pd.Timedelta(days=5, minutes=50, seconds=20, milliseconds=10, microseconds=10, nanoseconds=10) print(timeTmp) #计算当前时间往后100天的日期 dt = now + pd.Timedelta(days=100) #只显示年月日 print(dt.strftime('%Y-%m-%d')) >>5 days 00:50:20.010010 >>2020-07-07 3、pd.Period() #定义时期period,默认是A-DEC,代表年份,以12月作为最后一个月 p1=pd.Period('2019') p2=pd.Period('2018') print(f'p1={p1}年') print(f'p2={p2}年') print(f'p1和p2间隔{p1-p2}年') #可以直接+、-整数(代表年) print(f'十年前是{p1-10}年') >>p1=2019年 >>p2=2018年 >>p1和p2间隔年 >>十年前是2009年

通过asfreq转换时期频率

#以第一个月算,p1前面已赋值为2019年 print(p1.asfreq('M','start')) #以最后一个月算 print(p1.asfreq('M','end')) >>2019-01 >>2019-12

财报季度

p = pd.Period('2019Q3',freq='Q-DEC') #起始月日 print(p.asfreq('D','start')) #结束月日 print(p.asfreq('D','end')) >>2019-07-01 >>2019-09-30 4、pd.to_timestamp() 时间戳和时期相互转换 print(p1.to_timestamp(how='end')) print(p1.to_timestamp(how='start')) >>2019-12-31 23:59:59.999999999 >>2019-01-01 00:00:00 5、pd.to_period() 时间戳转为时期 #t1前面赋值为'2019-1-10' #转换为月时期 print(t1.to_period('M')) #转换为日时期 print(t1.to_period('D')) print(t1.to_period('W')) >>2019-01 >>2019-01-10 >>2019-01-07/2019-01-13 6、pd.to_datetime() pandas.to_datetime(arg,errors ='raise',utc = None,format = None,unit = None)

在这里插入图片描述

(1)获取指定的时间和日期

当数据很多,且日期格式不标准时的时候,可以使用to_datetime,将DataFrame中的时间转换成统一标准。 例如:df[’'date]数据类型为“object”,通过pd.to_datetime将该列数据转换为时间类型,即datetime。

df['date_formatted']=pd.to_datetime(df['date'],format='%Y-%m-%d') value = '2019-04-06' print(pd.datetime.strptime(value,'%Y-%m-%d')) //>>2019-01-07/2019-01-13 datastrs = ['2019-04-06 10:00:01','2019-4-8 10:00:03'] print(pd.to_datetime(datastrs)) //>>DatetimeIndex(['2019-04-06 10:00:01', '2019-04-08 10:00:03'], dtype='datetime64[ns]', freq=None)

常用时间:

类别解释year年month月day日hour时minute分second秒microsecond微秒nanosecond纳秒date返回日期time返回时间dayofyear年序日weekofyear年序周week周dayofweek周中的第几天,Monday=0, Sunday=6weekday周中的第几天,Monday=0, Sunday=6weekday_name星期quarter季度days_in_month一个月中有多少天is_month_start是否月初第一天is_month_end是否月末最后一天is_quarter_start是否季度第一天is_quarter_end是否季度最后一天is_year_start是否年初第一天is_year_end是否年末最后一天 (2)to_datetime可以处理那些被认为是缺失值的值(None、空字符串) idx = pd.to_datetime(datastrs + [None]) print(idx) print(idx[2]) print(pd.isnull(idx))

结果输出:

>>DatetimeIndex(['2019-04-06 10:00:01', '2019-04-08 10:00:03', 'NaT'], dtype='datetime64[ns]', freq=None) >>NaT >>[False False True] (3)将Str和Unicode转化为时间格式

这里偷懒,直接贴图,但是data.ORIGINAL_DUE_DATE_1[0],这是不存在的,大家理解就好: 在这里插入图片描述

7、strptime和strftime (1)字符串转换成datetime格式: strptime

用户输入的日期和时间是字符串,要处理日期和时间,首先必须把str转换为datetime。转换方法是通过datetime.strptime()实现,需要一个日期和时间的格式化字符串:

df_data1 = pd.DataFrame(columns=['date','values']) df_data1['date'] = ['2019-01-01','2019-01-02','2019-01-03','2019-01-04','2019-01-05'] df_data1['values'] = np.random.randn(5) print(df_data1) df_data1['date'] = df_data1['date'].map(lambda x:pd.datetime.strptime(x,'%Y-%m-%d')) print(df_data1)

结果显示: 在这里插入图片描述 注意转换后的datetime是没有时区信息的。 举例:将分开的年月日时整合,并设置为索引 数据集: 在这里插入图片描述

from datetime import datetime # load data def parse(x): return datetime.strptime(x, '%Y %m %d %H') dataset = read_csv('raw.csv', parse_dates = [['year', 'month', 'day', 'hour']], index_col=0, date_parser=parse) dataset.drop('No', axis=1, inplace=True) # manually specify column names dataset.columns = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain'] dataset.index.name = 'date' (2)datetime变回string格式: strftime

如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()实现的,同样需要一个日期和时间的格式化字符串:

df_data = pd.DataFrame(columns=['date','values']) df_data['date'] = pd.date_range('2019/01/01',periods=5) df_data['values'] = np.random.randn(5) print(df_data)

在这里插入图片描述 用strftime把datetime格式的时间数据转换成string

df_data['date'] = df_data['date'].apply(lambda x:x.strftime('%Y/%m')) #datetime格式转成str

以下是时间格式定义:

代码 说明 %Y 4位数的年 %y 2位数的年 %m 2位数的月[01,12] %d 2位数的日[01,31] %H 时(24小时制)[00,23] %l 时(12小时制)[01,12] %M 2位数的分[00,59] %S 秒[00,61]有闰秒的存在 %w 用整数表示的星期几[0(星期天),6] %F %Y-%m-%d简写形式例如,2017-06-27 %D %m/%d/%y简写形式 想偷懒的可以直接下载代码,另外数据也在:

https://download.csdn.net/download/im6520/12283247

主要参考: pandas处理时间序列(1):pd.Timestamp()、pd.Timedelta()、pd.datetime( )、 pd.Period()、pd.to_timestamp()、datetime.strftime()、pd.to_datetime( )、pd.to_period()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3