在 pandas 中,按 DatetimeIndex 中的日期进行分组

2024-03-22

考虑以下综合示例:

import pandas as pd
import numpy as np
np.random.seed(42)
ix = pd.date_range('2017-01-01', '2017-01-15', freq='1H')
df = pd.DataFrame(
    {
        'val': np.random.random(size=ix.shape[0]),
        'cat': np.random.choice(['foo', 'bar'], size=ix.shape[0])
    },
    index=ix
)

这会产生以下形式的表:

                    cat val
2017-01-01 00:00:00 bar 0.374540
2017-01-01 01:00:00 foo 0.950714
2017-01-01 02:00:00 bar 0.731994
2017-01-01 03:00:00 bar 0.598658
2017-01-01 04:00:00 bar 0.156019

现在,我想计算每个类别和日期的实例数量和平均值。

下列groupby,几乎是完美的:

df.groupby(['cat',df.index.date]).agg({'val': ['count', 'mean']})

返回:

                val
                count   mean
cat         
bar 2017-01-01  16  0.437941
    2017-01-02  16  0.456361
    2017-01-03  9   0.514388...

这个的问题是索引的第二层变成了字符串而不是date. 第一个问题:为什么会发生这种情况?我怎样才能避免它?

接下来,我尝试了组合groupby and resample:

df.groupby('cat').resample('1d').agg({'val': 'mean'})

在这里,索引是正确的,但我无法同时运行mean and count聚合。这是第二个问题: 为什么

df.groupby('cat').resample('1d').agg({'val': ['mean', 'count']})

不起作用?

最后一个问题获取聚合(使用两个函数)视图的干净方法是什么and with date索引类型?


对于第一个问题需要转换为datetime没有时间like https://stackoverflow.com/a/45943387/2901002:

df1 = df.groupby(['cat',df.index.floor('d')]).agg({'val': ['count', 'mean']})
#df1 = df.groupby(['cat',df.index.normalize()]).agg({'val': ['count', 'mean']})

#df1 = df.groupby(['cat',pd.to_datetime(df.index.date)]).agg({'val'‌​: ['count', 'mean']})

print (df1.index.get_level_values(1))


DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10', '2017-01-11', '2017-01-12',
               '2017-01-13', '2017-01-14', '2017-01-01', '2017-01-02',
               '2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06',
               '2017-01-07', '2017-01-08', '2017-01-09', '2017-01-10',
               '2017-01-11', '2017-01-12', '2017-01-13', '2017-01-14',
               '2017-01-15'],
              dtype='datetime64[ns]', freq=None)

... 因为dates 是 python 对象:

df1 = df.groupby(['cat',df.index.date]).agg({'val': ['count', 'mean']})
print (type(df1.index.get_level_values(1)[0]))
<class 'datetime.date'>

第二个问题 - 在我看来这是错误或尚未实现,因为在中使用一个函数名称agg only:

df2 = df.groupby('cat').resample('1d')['val'].agg('mean')
#df2 = df.groupby('cat').resample('1d')['val'].mean()
print (df2)
cat            
bar  2017-01-01    0.437941
     2017-01-02    0.456361
     2017-01-03    0.514388
     2017-01-04    0.580295
     2017-01-05    0.426841
     2017-01-06    0.642465
     2017-01-07    0.395970
     2017-01-08    0.359940
...
... 

但工作old way http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#groupby-syntax-with-window-and-resample-operations with apply:

df2 = df.groupby('cat').apply(lambda x: x.resample('1d')['val'].agg(['mean','count']))
print (df2)
                    mean  count
cat                            
bar 2017-01-01  0.437941     16
    2017-01-02  0.456361     16
    2017-01-03  0.514388      9
    2017-01-04  0.580295     12
    2017-01-05  0.426841     12
    2017-01-06  0.642465      7
    2017-01-07  0.395970     11
    2017-01-08  0.359940      9
    2017-01-09  0.564851     12
    ...
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 pandas 中,按 DatetimeIndex 中的日期进行分组 的相关文章

随机推荐

  • 在新线程问题中使用 spring 发送电子邮件

    我正在开发的应用程序的功能之一是 每次用户在我们的系统中注册他的发票时都会发送一封电子邮件 从 Java 应用程序发送电子邮件很容易 尤其是使用 Spring 框架时 我用JavaMailSenderImpl and 简单邮件消息来自 Sp
  • Gmail HTML 电子邮件背景

    我正在处理 HTML 电子邮件 我遇到的问题是 GMAIL 不使用我给它的 背景位置 我有一个 100 宽度的表格 其背景必须居中 大多数客户端都能完美地做到这一点 但 Gmail 却做不到 有解决方法吗 内联CSS是这样的 我已经将所有背
  • 在任何地方使用 eks 创建集群时出错

    我正在尝试在任何地方使用 eks 在 centos7 机器上创建本地集群 但是我遇到了以下错误 如果我遗漏了什么 请告诉我 这是我用来创建集群的链接 我还附上了集群创建 yaml 文件 Link https aws amazon com b
  • jquery .load 使用 python 烧瓶

    我试图在我的 Flask 应用程序中使用 jquery load 来在每次用户按下按钮添加新的 div 时添加一个 div 但它找不到 html 文件 有问题的函数 document ready function add click fun
  • 什么是全局::?

    在 C 中我看到global 在自动生成的代码中经常使用 这不是我自己用过的东西 所以我不知道它的目的是什么 有人可以解释一下吗 global 指的是全局命名空间 它可以用来解决重新定义类型的问题 例如 class foo class Sy
  • XMLHttpRequest() 与 ActiveXObject("Microsoft.XMLHTTP") - 有什么意义?

    Microsoft 最终在 Internet Explorer 7 中添加了本机 XMLHttpRequest 对象 但我发现它可以在 Internet 选项 对话框中禁用 那么使用 XMLHttpRequest 与 ActiveXObje
  • 使用 gcov 进行交叉分析,但忽略 GCOV_PREFIX 和 GCOV_PREFIX_STRIP

    我想使用 GCOV 进行代码覆盖 但测试将在另一台机器上运行 因此可执行文件中 gcda 文件的硬连线路径将不起作用 为了更改此默认目录 我可以使用 GCOV PREFIX 和 GCOV PREFIX STRIP 环境变量 如上所述here
  • 将 Twitter Bootstrap 添加到 CodeIgniter?

    我使用 CodeIgniter 开发了网站 该网站使用 MySQL 来填充结果页面 我现在想改进所有页面的外观 大多数地方都推荐使用 Bootstrap 我尝试将 Bootstrap 添加到我的 CodeIgniter 项目中 但没有成功
  • Qt:QProcess调用终端+脚本

    我在使用 QProcess 时遇到了真正的麻烦 我已经查看了几个使用它的位置 但每次使用它时我的程序都会冻结 或者它只是不执行我想要它执行的操作 我想从 GUI 应用程序执行以下操作 将目录更改为 Users Tim etc 等 从那里我需
  • 创建一个简单的 VUE.JS 应用程序

    我正在尝试按照以下步骤在应用程序中使用 Vue 中的简单多边形裁剪器article https morioh com p 06b7fc24c8b5 我使用以下方法创建了我的应用程序 vue init webpack myproject 现在
  • 如何在包含 Rust 特征的泛型类型上实现 deref?

    如果能够使用 Deref 从通用容器生成 TraitType 而不是调用 instance as ref 会相当方便 IE my container do thing vs my container as ref do thing 为此 我
  • 防止复制使用 dompdf 创建的 pdf 中的内容

    有没有办法阻止接收者在dompdf中选择和复制pdf文件的内容 像其他打开它时看起来像图片的pdf文件一样 所有字母和图像都无法选择 您可以使用底层 CPDF 引擎来指定用户可以对文档执行哪些操作 根据 CPDF 文档 调用 setEncr
  • 获取设备令牌时发件人 ID 无效

    我正在我的 Android 应用程序中进行 Firebase 云消息传递设置 我不是第一次做 我已经做过很多次了 但这一次 我在尝试获取设备令牌时遇到了一个奇怪的错误 无效的发件人 ID 除了默认情况下存在于 google services
  • 如何使用Java打开和关闭虚拟键盘

    我尝试了这里的所有答案 在Java程序中打开Windows虚拟键盘 https stackoverflow com questions 4948420 open the windows virtual keyboard in a java
  • 抽象类中受保护的抽象或公共抽象方法

    嗨 我有一个抽象类 其中有一些公共方法和一些抽象方法 我有公众 以便他们实现派生类的通用方法 让我困惑的是为什么我想要定义一个公共抽象方法而不是受保护的抽象方法 对我来说 在抽象类中定义公共抽象方法是没有意义的 因为 if 是一个抽象 在派
  • Laravel 5,连接子句中的派生表?

    我有这样的疑问 SELECT FROM blog LEFT JOIN SELECT blog id AVG value as blog rating FROM blog ratings GROUP BY blog id T ON T blo
  • 绘制的 envfit 向量与 NMDS 分数不匹配

    我制作了一个 NMDS 图并绘制了我的环境 如下所示 mytable 的数据框 sites c Site A Site B Site C Site D Site E Site F Site G Site H Site I Site J Si
  • heroku无法安装zbar

    我有一个 Django 应用程序 它使用 zbar 进行条形码识别 它在我的开发人员机器上运行良好 但当我尝试将其部署到 Heroku 时 我的提交被拒绝 并显示以下消息 Installing collected packages zbar
  • 调用 FileWriter 的单元测试方法

    我正在尝试为调用 FileWriter 的方法编写单元测试 我正在使用 JUnit 4 8 Powermock 和 Mockito 我正在测试的方法看起来像这样 public void methodToTest String fileNam
  • 在 pandas 中,按 DatetimeIndex 中的日期进行分组

    考虑以下综合示例 import pandas as pd import numpy as np np random seed 42 ix pd date range 2017 01 01 2017 01 15 freq 1H df pd D