当前位置:   article > 正文

Pandas处理日期数据的常见操作集锦_pandas日期计算

pandas日期计算

Pandas处理日期数据的常见操作集锦

  • 数据读取及整理
  • 获取某个日期之前/后或时间区间的数据
  • python 获取当前时间及前一天时间
  • pandas的日期时间间隔运算选取指定时间范围内/外的数据
  • 利用pandas计算DataFrame两列日期的间隔小时数
  • numpy中-Datetimes and Timedeltas的使用
  • 日期格式转换
  • 日期的计算

数据读取及整理

将数据类型转换为日期类型

 df['date'] = pd.to_datetime(df['date'])

将date设置为index

 df = df.set_index('date')

获取某年的数据

print(df['2010'].head())

 

获取某月的数据

print(df['2013-11'].head())

 

提取全日期字段中的日期和时间项

  1. data4["订单生成时间"] = pd.to_datetime(data4["订单生成时间"])
  2. data4["时间"] = data4["订单生成时间"].dt.hour #提取时间
  3. data4["日期"] = data4["订单生成时间"].dt.date #提取日期


获取某个日期之前/后或时间区间的数据
dataframe.truncate()函数可以截取某个时期之前或之后的数据,或者某个时间区间的数据,进行统计分析。
注意事项:
使用.truncate()函数对df进行数据集截取,遇到截取数据不符合预期,且若时间序列无序会抛出异常
解决措施:
在使用.truncate()函数对df进行数据集截取之前,需要先使用df=df.sort_values(‘date’)‘date’列按时间先后进行排序,然后使用df = df.set_index('date'),将“date”设置为index,最后再使用df_last=df.truncate(after=‘2019-05-22 16:00:00’)提取指定时间节点之前的数据。
函数语法:

DataFrame.truncate(before=None, after=None, axis=None, copy=True)


参数说明:
before:取值范围:date,string,int,是指截断此索引值之前的所有行
after:取值范围:date,string,int,是指截断此索引值后的所有行
axis:取值范围:{0或’index’,1或’columns’}(可选),是指轴截断。 默认情况截断索引(行)。
copy:取值范围:boolean,默认为True,返回截断部分的副本
常见用法:

  1. 获取2014年以后的数据
print(df.truncate(before='2014').head())

 

获取2013-11月之前的数据,用after

print(df.truncate(after='2013-11').head())

 

获取2016-02月以后的数据,用before

 

print(df.truncate(before='2016-02').head())

获取2019-05-22日16:00:00时之前的数据

 df=data.truncate(after='2019-05-22 16:00:00')

获取指定时间区间的数据

 df=df['2016-02-2':'2016-02-10']

获取指定时间区间的数据

 df=df['2016-02-2':'2016-02-10']


python 获取当前时间及前一天时间

  1. import datetime
  2. from pandas.tseries.offsets import Day
  3. now_time =datetime.datetime.now()#获取当前时间
  4. yes_time = (now_time -1*Day()).strftime('%Y-%m-%d')#格式化
  5. print(yes_time)

pandas的日期时间间隔运算

  1. import datetime
  2. from datetime import timedelta
  3. df_189[‘订单生成日期’]=pd.to_datetime(df_189[‘订单生成日期’]) #修改“订单生成时间”的数据类型
  4. df_189[‘订单生成日期’]+timedelta(days=1) #后一天的日期
  5. df_189[‘订单生成日期’]-timedelta(days=3) #前3天的日期

选取指定时间范围内/外的数据

  1. ##提取3日前日期和7日前日期
  2. now_time =datetime.datetime.now()#获取当前时间
  3. yes_time_7 = (now_time -7*Day()).strftime('%Y-%m-%d')#格式化
  4. yes_time_3= (now_time-3*Day()).strftime("%Y-%m-%d")
  5. print(yes_time_7)
  6. print('='*50)
  7. print(yes_time_3)df_189['订单生成日期']=pd.to_datetime(df_189['订单生成日期']) #修改“订单生成时间”的数据类型
  8. df_189_7= df_189[df_189['订单生成日期']==yes_time_7]
  9. df_189_3= df_189[df_189['订单生成日期']==yes_time_3]
  10. print(df_189_7.info()) #选取该错误数据对应的时间范围外的数据,多个条件时 '|'代表'或','&'代表'且' 或者
  11. a= df_189[df_189['订单生成日期']=='2019-06-23'] #筛选2019-06-23的数据

利用pandas计算DataFrame两列日期的间隔小时数

  1. import pandas as pd
  2. #方法一:
  3. #先利用to_datetime转换为时间格式,tm列的数据形式为'yyyy-MM-dd HH:mm:ss'
  4. df['tm_1'] = pd.to_datetime(df['tm_1'])
  5. df['tm_2'] = pd.to_datetime(df['tm_2'])
  6. #利用".dt.seconds"转换为秒,除以相对于的间隔数得到分钟、小时等
  7. df['diff_time'] = (df['tm_1'] - df['tm_2']).dt.seconds/60
  8. #利用round函数可进行四舍五入
  9. df['diff_time'] = round(df['diff_time'])
  10. #方法二,日期相减变为小时;变为天的话将h替换为D即可:
  11. df['diff_time'] = (df['tm_1'] - df['tm_2']).values/np.timedelta64(1, 'h')
  12. #Dataframe中的时间是不能直接进行相加减的,所以需要先用pandas的to_datetime()方法,转化成时间格式进行加减,然后再转换成df格式
  13. #delta=df1['Time_end']-df1['Time_start'] #直接报错TypeError: unsupported operand type(s) for -: 'str' and 'str'
  14. #日期相减变为小时;变为天的话将h替换为D即可:
  15. sf_df['交易周期']=pd.DataFrame((pd.to_datetime(sf_df['交易完成时间'])-pd.to_datetime(sf_df['订单生成时间'])).values/np.timedelta64(1,'h'))

 

numpy中-Datetimes and Timedeltas的使用日期格式转换
numpy中,使用np.datetime64('2017-08' , 'D')可以很方便的将字符串转换成日期类型。

  1. import numpy as np
  2. np.datetime64('2017-08-06') #精确到日
  3. >>>
  4. numpy.datetime64('2017-08-06')
  5. np.datetime64('2018-08') #精确到月
  6. >>>
  7. numpy.datetime64('2018-08')
  8. # 通过参数,强制将数据格式转为我们想要的粒度
  9. np.datetime64('2017-08','D') #转化到日
  10. >>>
  11. numpy.datetime64('2017-08-01')
  12. np.datetime64('2017-08','Y') #转化到年
  13. >>>
  14. numpy.datetime64('2017')
  15. a = np.array(['2017-07-01','2017-07-15','2017-08-01'],dtype = np.datetime64) #列表日期
  16. a
  17. >>>
  18. array(['2017-07-01', '2017-07-15', '2017-08-01'], dtype='datetime64[D]')
  19. # 我们也可以使用arange函数初始化数组
  20. b = np.arange('2017-08-01','2017-09-01',dtype = np.datetime64)
  21. b
  22. >>>
  23. array(['2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04',
  24. '2017-08-05', '2017-08-06', '2017-08-07', '2017-08-08',
  25. '2017-08-09', '2017-08-10', '2017-08-11', '2017-08-12',
  26. '2017-08-13', '2017-08-14', '2017-08-15', '2017-08-16',
  27. '2017-08-17', '2017-08-18', '2017-08-19', '2017-08-20',
  28. '2017-08-21', '2017-08-22', '2017-08-23', '2017-08-24',
  29. '2017-08-25', '2017-08-26', '2017-08-27', '2017-08-28',
  30. '2017-08-29', '2017-08-30', '2017-08-31'], dtype='datetime64[D]')

日期的计算
在numpy中,我们可以进行简单的日期计算

  1. # 两个日期相减,会得到相差的天数
  2. np.datetime64('2017-08-03') - np.datetime64('2017-07-15')
  3. >>>
  4. numpy.timedelta64(19,'D')
  5. # 这里日期可以直接减去对应的天数
  6. np.datetime64('2017-08-03') - np.timedelta64(20,'D')
  7. >>>
  8. #这里日期的粒度必须保证一样,一个是D,一个是M,是不可以相减的
  9. np.datetime64('2017-08-03') - np.timedelta64(1,'M')
  10. >>>
  11. TypeError: Cannot get a common metadata divisor for NumPy datetime metadata [D] and [M] because they have incompatible nonlinear base time units
  12. np.datetime64('2017-08') - np.timedelta64(1,'M')
  13. >>>
  14. numpy.datetime64('2017-07')
  15. (np.datetime64('2014-10-30 23:00:00') - np.datetime64('2014-10-21 00:00:00')) #按秒计时
  16. (np.datetime64('2014-10-30 23:00:00') - np.datetime64('2014-10-21 00:00:00'))/np.timedelta64(1, 'h') #计算时间差,并转为小时
  17. >>>
  18. 239.0
  19. #计算终止时间-初试时间,转为小时格式,最后格式设置为整型。np.floor((x - start_hour) / np.timedelta64(1, 'h')).astype(np.uint16)
  20. np.floor((np.datetime64('2014-10-30 23:00:00') -
  21. np.datetime64('2014-10-21 00:00:00'))/np.timedelta64(1, 'h')).astype(np.uint16)
  22. >>>
  23. 239


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/230297
推荐阅读
相关标签
  

闽ICP备14008679号