如何按天拆分熊猫数据框或系列(可能使用迭代器)

Posted

技术标签:

【中文标题】如何按天拆分熊猫数据框或系列(可能使用迭代器)【英文标题】:How to split a pandas dataframe or series by day (possibly using an iterator) 【发布时间】:2014-03-03 13:13:32 【问题描述】:

我有很长的时间序列,例如。

import pandas as pd
index=pd.date_range(start='2012-11-05', end='2012-11-10', freq='1S').tz_localize('Europe/Berlin')
df=pd.DataFrame(range(len(index)), index=index, columns=['Number'])

现在我想提取每天的所有子数据帧,以获得以下输出:

df_2012-11-05: data frame with all data referring to day 2012-11-05
df_2012-11-06: etc.
df_2012-11-07
df_2012-11-08
df_2012-11-09
df_2012-11-10

避免检查 index.date==give_date 是否非常慢的最有效方法是什么。此外,用户事先并不知道帧中的天数范围。

有什么提示可以用迭代器做到这一点吗?

我目前的解决方案是这样,但它不是那么优雅,并且有两个问题定义如下:

time_zone='Europe/Berlin'
# find all days
a=np.unique(df.index.date) # this can take a lot of time
a.sort()
results=[]
for i in range(len(a)-1):
    day_now=pd.Timestamp(a[i]).tz_localize(time_zone)
    day_next=pd.Timestamp(a[i+1]).tz_localize(time_zone)
    results.append(df[day_now:day_next]) # how to select if I do not want day_next included?

# last day
results.append(df[day_next:])

这种方法存在以下问题:

a=np.unique(df.index.date) 可能需要很长时间 df[day_now:day_next] 包括 day_next,但我需要在范围内排除它

【问题讨论】:

【参考方案1】:

如果您想按日期分组(又名:年+月+日),请使用df.index.date

result = [group[1] for group in df.groupby(df.index.date)]

由于df.index.day 将使用月份中的某天(即:从 1 到 31)进行分组,如果输入数据框日期延长到多个月份,这可能会导致不良行为。

【讨论】:

这应该是公认的答案,按天分组通常不是您想要的。 接受的答案是错误的。如果您正在阅读并且您同意,请投票赞成这个答案,因为我不能这样做【参考方案2】:

也许是groupby?

DFList = []
for group in df.groupby(df.index.day):
    DFList.append(group[1])

应该给你一个数据框列表,其中每个数据框是一天的数据。

或者在一行中:

DFList = [group[1] for group in df.groupby(df.index.day)]

一定要爱上蟒蛇!

【讨论】:

最好按 df.index.date 分组,因为这样我们肯定会选择不同的日期,使用 index.day 2001 年 12 月 2 日和 2002 年 1 月 2 日将是同一天。不幸的是,使用日期计算显然需要更多时间。我认为 pandas 中缺少的是通过不同的时间/日期类别进行快速选择,这可能需要像在数据库中那样构建一些先验索引 好的,df.groupby([df.index.year,df.index.month,df.index.day]) 使其速度提高了 90%,同时确保正确区分日期 但是它根据日期的字符串表示来分组。不是基于 Date 的 Datetime 表示。

以上是关于如何按天拆分熊猫数据框或系列(可能使用迭代器)的主要内容,如果未能解决你的问题,请参考以下文章

迭代熊猫系列元素的最佳方法

熊猫迭代更新列值

如何加快熊猫数据框迭代

如何在熊猫中迭代数据框时保留数据类型?

如何在熊猫数据帧上迭代 TfidfVectorizer()

如何迭代熊猫数据框的列以运行回归