iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >使用pandas怎么根据日期做分组运算
  • 750
分享到

使用pandas怎么根据日期做分组运算

2023-06-14 08:06:01 750人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关使用pandas怎么根据日期做分组运算,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。原始数据TS PERioD REQUEST ST

这篇文章将为大家详细讲解有关使用pandas怎么根据日期做分组运算,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

原始数据

TS PERioD REQUEST STEPPED VALUE STATUS SECONDS20-DEC-16 00:00:00.0 600 1 0  2.018 0 148216320020-DEC-16 00:01:00.0 600 1 0  2.019 0 148216326020-DEC-16 00:02:00.0 600 1 0  2.019 0 148216332020-DEC-16 00:03:00.0 600 1 0  2.019 0 148216338020-DEC-16 00:04:00.0 600 1 0  2.019 0 148216344020-DEC-16 00:05:00.0 600 1 0  2.020 0 148216350020-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 npfrom pandas import DataFrame, Seriesimport pandas as pdfrom 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   time0  6522.50 1.530668e+091  6522.66 1.530668e+092  6523.79 1.530668e+093  6523.79 1.530668e+094  6524.82 1.530668e+095  6524.35 1.530668e+096  6523.66 1.530668e+097  6522.64 1.530668e+098  6523.25 1.530668e+099  6523.88 1.530668e+0910  6525.30 1.530668e+0911  6525.70 1.530668e+09...   ...   ...407443 6310.69 1.531302e+09407444 6310.55 1.531302e+09407445 6310.42 1.531302e+09407446 6310.40 1.531302e+09407447 6314.03 1.531302e+09407448 6314.04 1.531302e+09407449 6312.84 1.531302e+09407450 6312.57 1.531302e+09407451 6312.56 1.531302e+09407452 6314.04 1.531302e+09407453 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 data0  25511135 331  25511136 182  25511137 253  25511138 424  25511139 365  25511140  76  25511141 617  25511142 458  25511143 469  25511144 1910  25511145 21...   ... ...10387 25521697  310388 25521698  910389 25521699 1610390 25521700 1310391 25521701  410392 25521702 3410393 25521703 12410394 25521704 30210395 25521705 8610396 25521706 52 [10397 rows x 2 columns]

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

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

如下:

   0  1  2  3  ... 1143 1144 1145 11460  6522.50 6522.66 6523.79 6523.79 ... NaN NaN NaN NaN1  6523.95 6524.90 6525.00 6524.35 ... NaN NaN NaN NaN2  6520.87 6520.00 6520.45 6520.46 ... NaN NaN NaN NaN3  6516.34 6516.26 6516.21 6516.21 ... NaN NaN NaN NaN4  6513.28 6514.00 6514.00 6514.00 ... NaN NaN NaN NaN5  6511.98 6511.98 6511.99 6513.00 ... NaN NaN NaN NaN6  6511.00 6511.00 6511.00 6511.00 ... NaN NaN NaN NaN7  6511.70 6511.78 6511.99 6511.99 ... NaN NaN NaN NaN8  6509.51 6510.00 6510.80 6510.80 ... NaN NaN NaN NaN9  6511.36 6510.00 6510.00 6510.00 ... NaN NaN NaN NaN10  6507.00 6507.00 6507.00 6507.00 ... NaN NaN NaN NaN...  ...  ...  ...  ... ... ... ... ... ...10386 6333.77 6331.31 6331.30 6333.19 ... NaN NaN NaN NaN10387 6331.68 6331.30 6331.68  NaN ... NaN NaN NaN NaN10388 6331.30 6331.30 6331.00 6331.00 ... NaN NaN NaN NaN10389 6330.93 6330.92 6330.92 6330.93 ... NaN NaN NaN NaN10390 6330.83 6330.83 6330.90 6330.80 ... NaN NaN NaN NaN10391 6327.57 6326.00 6326.00 6325.74 ... NaN NaN NaN NaN10392 6327.57 6329.70 6328.85 6328.85 ... NaN NaN NaN NaN10393 6323.54 6323.15 6323.15 6322.77 ... NaN NaN NaN NaN10394 6311.00 6310.83 6310.83 6310.50 ... NaN NaN NaN NaN10395 6311.45 6311.32 6310.01 6310.01 ... NaN NaN NaN NaN10396 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  11480  6522.50 6522.66 6523.79 ...  6522.14 6522.14 255111351  6523.95 6524.90 6525.00 ...  6520.00 6520.00 255111362  6520.87 6520.00 6520.45 ...  6517.00 6517.00 255111373  6516.34 6516.26 6516.21 ...  6514.00 6514.00 255111384  6513.28 6514.00 6514.00 ...  6511.97 6511.97 255111395  6511.98 6511.98 6511.99 ...  6511.00 6511.00 255111406  6511.00 6511.00 6511.00 ...  6510.90 6510.90 255111417  6511.70 6511.78 6511.99 ...  6512.09 6512.09 255111428  6509.51 6510.00 6510.80 ...  6512.09 6512.09 255111439  6511.36 6510.00 6510.00 ...  6507.04 6507.04 2551114410  6507.00 6507.00 6507.00 ...  6508.57 6508.57 2551114511  6507.16 6507.74 6507.74 ...  6506.35 6506.35 25511146...  ...  ...  ... ...   ...  ...  ...10388 6331.30 6331.30 6331.00 ...  6331.00 6331.00 2552169810389 6330.93 6330.92 6330.92 ...  6330.99 6330.99 2552169910390 6330.83 6330.83 6330.90 ...  6327.58 6327.58 2552170010391 6327.57 6326.00 6326.00 ...  6325.74 6325.74 2552170110392 6327.57 6329.70 6328.85 ...  6325.00 6325.00 2552170210393 6323.54 6323.15 6323.15 ...  6311.00 6311.00 2552170310394 6311.00 6310.83 6310.83 ...  6315.00 6315.00 2552170410395 6311.45 6311.32 6310.01 ...  6310.00 6310.00 2552170510396 6310.46 6310.46 6310.56 ...  6314.04 6314.04 25521706 [10397 rows x 1148 columns]

关于使用pandas怎么根据日期做分组运算就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 使用pandas怎么根据日期做分组运算

本文链接: https://www.lsjlt.com/news/269245.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用pandas怎么根据日期做分组运算
    这篇文章将为大家详细讲解有关使用pandas怎么根据日期做分组运算,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。原始数据TS PERIOD REQUEST ST...
    99+
    2023-06-14
  • 利用pandas按日期做分组运算的操作
    原始数据 TS PERIOD REQUEST STEPPED VALUE STATUS SECONDS 20-DEC-16 00:00:00.0 600 1 0 2.018 0...
    99+
    2022-11-11
  • 怎么使用PHP根据星期几来判断日期
    这篇文章主要介绍“怎么使用PHP根据星期几来判断日期”,在日常操作中,相信很多人在怎么使用PHP根据星期几来判断日期问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用PHP根据星期几来判断日期”的疑惑有所...
    99+
    2023-07-06
  • 怎么使用python中分组函数groupby和分组运算函数agg
    这篇文章主要介绍“怎么使用python中分组函数groupby和分组运算函数agg”,在日常操作中,相信很多人在怎么使用python中分组函数groupby和分组运算函数agg问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作