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


问题内容

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

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'])

现在,我想提取每天的所有子DataFrame,以获取以下输出:

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,但是我需要将其排除在范围之外

问题答案:

也许是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)]

要爱蟒蛇!