利用pandas按日期做分组运算的操作

 更新时间:2021年3月26日 15:01  点击:1493

原始数据

TS PERIOD REQUEST STEPPED VALUE STATUS SECONDS
20-DEC-16 00:00:00.0 600 1 0  2.018 0 1482163200
20-DEC-16 00:01:00.0 600 1 0  2.019 0 1482163260
20-DEC-16 00:02:00.0 600 1 0  2.019 0 1482163320
20-DEC-16 00:03:00.0 600 1 0  2.019 0 1482163380
20-DEC-16 00:04:00.0 600 1 0  2.019 0 1482163440
20-DEC-16 00:05:00.0 600 1 0  2.020 0 1482163500
20-DEC-16 00:06:00.0 600 1 0  2.020 0 1482163560

我们的目标是把TS列从

20-DEC-16 00:00:00.0

转变为

20-DEC-16

的格式,然后按天取均值。

导入包

import numpy as np
from pandas import DataFrame, Series
import pandas as pd
from datetime import datetime

读入文件

df = pd.read_csv('data/test.txt',sep='\t')

这里没有解决中文路径名和绝对路径的问题.

转化为数据框

df = DataFrame(df)

转化为时间格式

将TS列转化为时间格式,并保存为新的一列DATE,之后,只留下DATE和VALUE两列,其他统统不要。

df['DATE'] = pd.to_datetime(df['TS'])
df = df[['DATE','VALUE']]

关键一步

把形如‘2017-9-4 00:00:00'转化为‘2017-9-4 '

df['DATE'] = [datetime.strftime(x,'%Y-%m-%d') for x in df['DATE']]

strftime有若干参数,其中Y表示四位数的年,m表示两位数的月。

旋转数据框

df =df.pivot_table(index='DATE',aggfunc='mean')

补充:利用Pandas和Numpy按时间戳将数据以Groupby方式分组

首先说一下需求,我需要将数据以分钟为单位进行分组,然后每一分钟内的数据作为一行输出,因为不同时间的数据量不一样,所以所有数据按照最长的那组数据为准,不足的数据以各自的最后一个数据进行补足。

之后要介绍一下我的数据源,之前没用的数据列已经去除,我只留下要用到的数据data列和时间戳time列,时间戳是以秒计的,可以看到一共是407454行。


   data   time
0  6522.50 1.530668e+09
1  6522.66 1.530668e+09
2  6523.79 1.530668e+09
3  6523.79 1.530668e+09
4  6524.82 1.530668e+09
5  6524.35 1.530668e+09
6  6523.66 1.530668e+09
7  6522.64 1.530668e+09
8  6523.25 1.530668e+09
9  6523.88 1.530668e+09
10  6525.30 1.530668e+09
11  6525.70 1.530668e+09
...   ...   ...
407443 6310.69 1.531302e+09
407444 6310.55 1.531302e+09
407445 6310.42 1.531302e+09
407446 6310.40 1.531302e+09
407447 6314.03 1.531302e+09
407448 6314.04 1.531302e+09
407449 6312.84 1.531302e+09
407450 6312.57 1.531302e+09
407451 6312.56 1.531302e+09
407452 6314.04 1.531302e+09
407453 6314.04 1.531302e+09
 
[407454 rows x 2 columns]

开始进行数据处理,定义一个函数,输入为一个DataFrame和时间列的命名。

def getdata_time(dataframe,name):
 dataframe[name] = dataframe[name]/60 #将时间转换为分钟
 dataframe[name] = dataframe[name].astype('int64') 
 datalen = dataframe.groupby(name).count().max()  #获取数据最大长度 
 timeframe = dataframe.groupby(name).count().reset_index()#为了获取时间将分组后时间转换为DataFrame
 timeseries = timeframe['time'] 
 array = []  #建立一个空数组以便存值

 for time, group in dataframe.groupby(name): 
 tmparray = numpy.array(group['data']) #将series转换为数组并添加到总数组中
 array.append(tmparray) 
 notimedata = pandas.DataFrame(array)
 notimedata = notimedata.fillna(method='ffill',axis = 1,limit=datalen[0]) #将缺失值补全
 notimedata[datalen[0]+1] = timeseries #把时间添加到最后一列 
 return notimedata

下面将逐行进行分析,首先要以每分钟为依据进行分组,那么将秒计的时间戳除以60变为分钟,转换为int型是为了观察方便(更改类型是否会导致数据精度缺失影响结果并不清楚,如果有了解的人看到欢迎指出,谢谢)。

datalen是我们要用到的每分钟中最大的数据长度,用来作为标齐依据。DataFrame.groupby.count()是分别显示每组数据的个数,并不是显示有多少个分组,如果想要获取分组后每一组的index就需要用到下一行的reset_index方法,之所以不直接用reset_index而是在count()方法后调用是因为groupby分组后的结果不是一个DataFrame,而经过count()(不仅仅是count,对分组数据操作的方法都可以,只要得出的结果是与每一组的index一一对应即可)操作后就可以得到一个以index为一列,另一列是count结果的DataFrame。

以下为直接进行reset_index操作的报错:

AttributeError: Cannot access callable attribute 'reset_index' of 'DataFrameGroupBy' objects, try using the 'apply' method

以下为经过count操作后的reset_index方法显示结果,可以看到一共分为了10397组:

   time data
0  25511135 33
1  25511136 18
2  25511137 25
3  25511138 42
4  25511139 36
5  25511140  7
6  25511141 61
7  25511142 45
8  25511143 46
9  25511144 19
10  25511145 21
...   ... ...
10387 25521697  3
10388 25521698  9
10389 25521699 16
10390 25521700 13
10391 25521701  4
10392 25521702 34
10393 25521703 124
10394 25521704 302
10395 25521705 86
10396 25521706 52
 
[10397 rows x 2 columns]

提取的timeseries将在最后数据整合时使用。

现在开始将每组数据提取,首先建立一个空的数组用来存放,然后利用for循环获取每一组的信息,time即为分组的index,group即为每一分组的内容,将数据从group['data']中取出并添加到之前建立的空数组里,循环操作过后转换为DataFrame,当然这个DataFrame中包含了大量缺失值,因为它的列数是以最长的数据为准。

如下:

   0  1  2  3  ... 1143 1144 1145 1146
0  6522.50 6522.66 6523.79 6523.79 ... NaN NaN NaN NaN
1  6523.95 6524.90 6525.00 6524.35 ... NaN NaN NaN NaN
2  6520.87 6520.00 6520.45 6520.46 ... NaN NaN NaN NaN
3  6516.34 6516.26 6516.21 6516.21 ... NaN NaN NaN NaN
4  6513.28 6514.00 6514.00 6514.00 ... NaN NaN NaN NaN
5  6511.98 6511.98 6511.99 6513.00 ... NaN NaN NaN NaN
6  6511.00 6511.00 6511.00 6511.00 ... NaN NaN NaN NaN
7  6511.70 6511.78 6511.99 6511.99 ... NaN NaN NaN NaN
8  6509.51 6510.00 6510.80 6510.80 ... NaN NaN NaN NaN
9  6511.36 6510.00 6510.00 6510.00 ... NaN NaN NaN NaN
10  6507.00 6507.00 6507.00 6507.00 ... NaN NaN NaN NaN
...  ...  ...  ...  ... ... ... ... ... ...
10386 6333.77 6331.31 6331.30 6333.19 ... NaN NaN NaN NaN
10387 6331.68 6331.30 6331.68  NaN ... NaN NaN NaN NaN
10388 6331.30 6331.30 6331.00 6331.00 ... NaN NaN NaN NaN
10389 6330.93 6330.92 6330.92 6330.93 ... NaN NaN NaN NaN
10390 6330.83 6330.83 6330.90 6330.80 ... NaN NaN NaN NaN
10391 6327.57 6326.00 6326.00 6325.74 ... NaN NaN NaN NaN
10392 6327.57 6329.70 6328.85 6328.85 ... NaN NaN NaN NaN
10393 6323.54 6323.15 6323.15 6322.77 ... NaN NaN NaN NaN
10394 6311.00 6310.83 6310.83 6310.50 ... NaN NaN NaN NaN
10395 6311.45 6311.32 6310.01 6310.01 ... NaN NaN NaN NaN
10396 6310.46 6310.46 6310.56 6311.61 ... NaN NaN NaN NaN
 
[10397 rows x 1147 columns]

可以看到行数是分组个数,一共1147列也是最多的那组数据长度。

之后我们通过调用fillna方法将缺失值进行填充,method='ffill'是指以缺失值前一个数据为依据,axis = 1是以行为单位,limit是指最大填充长度。最终,把我们之前取得的timeseries添加到最后一列,就得到了需求的最终结果。

   0  1  2  ...  1145  1146  1148
0  6522.50 6522.66 6523.79 ...  6522.14 6522.14 25511135
1  6523.95 6524.90 6525.00 ...  6520.00 6520.00 25511136
2  6520.87 6520.00 6520.45 ...  6517.00 6517.00 25511137
3  6516.34 6516.26 6516.21 ...  6514.00 6514.00 25511138
4  6513.28 6514.00 6514.00 ...  6511.97 6511.97 25511139
5  6511.98 6511.98 6511.99 ...  6511.00 6511.00 25511140
6  6511.00 6511.00 6511.00 ...  6510.90 6510.90 25511141
7  6511.70 6511.78 6511.99 ...  6512.09 6512.09 25511142
8  6509.51 6510.00 6510.80 ...  6512.09 6512.09 25511143
9  6511.36 6510.00 6510.00 ...  6507.04 6507.04 25511144
10  6507.00 6507.00 6507.00 ...  6508.57 6508.57 25511145
11  6507.16 6507.74 6507.74 ...  6506.35 6506.35 25511146
...  ...  ...  ... ...   ...  ...  ...
10388 6331.30 6331.30 6331.00 ...  6331.00 6331.00 25521698
10389 6330.93 6330.92 6330.92 ...  6330.99 6330.99 25521699
10390 6330.83 6330.83 6330.90 ...  6327.58 6327.58 25521700
10391 6327.57 6326.00 6326.00 ...  6325.74 6325.74 25521701
10392 6327.57 6329.70 6328.85 ...  6325.00 6325.00 25521702
10393 6323.54 6323.15 6323.15 ...  6311.00 6311.00 25521703
10394 6311.00 6310.83 6310.83 ...  6315.00 6315.00 25521704
10395 6311.45 6311.32 6310.01 ...  6310.00 6310.00 25521705
10396 6310.46 6310.46 6310.56 ...  6314.04 6314.04 25521706
 
[10397 rows x 1148 columns]

以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。如有错误或未考虑完全的地方,望不吝赐教。

[!--infotagslink--]

相关文章

  • pandas pd.read_csv()函数中parse_dates()参数的用法说明

    这篇文章主要介绍了pandas pd.read_csv()函数中parse_dates()参数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-05
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • php计算两个日期相差天数的方法

    本文实例讲述了php计算两个日期相差天数的方法。...2015-03-15
  • Pandas实现DataFrame按行求百分数(比例数)

    今天小编就为大家分享一篇Pandas实现DataFrame按行求百分数(比例数),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-09
  • vue开发之moment的介绍与使用

    moment是一款多语言支持的日期处理类库, 在vue中如何使用呢?这篇文章主要给大家介绍了关于vue之moment使用的相关资料,需要的朋友可以参考下...2021-05-13
  • python使用pandas按照行数分割表格

    本文主要介绍了python使用pandas按照行数分割表格,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-13
  • 非常全面的php日期时间运算汇总

    实例讲解之前,先来介绍几个核心函数: mktime 函数 mktime() 函数返回一个日期的 Unix 时间戳。 参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。 参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。...2015-11-08
  • C#实现将字符串转换成日期格式的方法

    这篇文章主要介绍了C#实现将字符串转换成日期格式的方法,涉及C#操作时间及字符串的相关技巧,非常简单实用,需要的朋友可以参考下...2020-06-25
  • php根据日期或时间戳获取星座信息和生肖等信息

    分享一个利用php根据日期或时间戳获取相应的干支纪年,生肖和星座信息的函数方法,具体函数代码以及使用方法如下: /** 判断干支、生肖和星座 */ function birthext($birth){ if(strstr($birth,'-')===false&&strlen($bi...2015-10-21
  • java8时间 yyyyMMddHHmmss格式转为日期的代码

    这篇文章主要介绍了java8时间 yyyyMMddHHmmss格式转为日期的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17
  • C#判断日期是否到期的方法

    这篇文章主要介绍了C#判断日期是否到期的方法,是C#程序设计中非常实用的技巧,需要的朋友可以参考下...2020-06-25
  • sql通过日期判断年龄函数的示例代码

    这篇文章主要介绍了sql通过日期判断年龄函数,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-07-16
  • C#比较日期的方法总结

    在本篇内容中小编给大家整理了关于C#比较日期的方法和相关知识点,有需要的朋友们学习下。...2020-06-25
  • 微信小程序wxs日期时间处理的实现示例

    最近在做一个列表的时候,涉及到时间格式化操作。本文主要介绍了微信小程序wxs日期时间处理的实现示例,分享给大家,感兴趣的可以了解一下...2021-07-22
  • jQuery DateTimePicker 日期和时间插件示例

    jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件,这篇文章主要介绍了jQuery DateTimePicker 日期和时间插件示例,有兴趣的可以了解一下。...2017-01-26
  • 解决python3安装pandas出错的问题

    这篇文章主要介绍了解决python3安装pandas出错的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-05-20
  • js显示当前日期时间和星期几

    JavaScript获取当前日期时间同时显示星期几,具体代码如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="/jquery/1.7.0/jquery.min.js...2015-10-23
  • C语言实现时间戳转日期的算法(推荐)

    下面小编就为大家带来一篇C语言实现时间戳转日期的算法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • Python数据分析之pandas比较操作

    比较操作是很简单的基础知识,不过Pandas中的比较操作有一些特殊的点,本文介绍的非常详细,对正在学习python的小伙伴们很有帮助.需要的朋友可以参考下...2021-05-20