我有一个长时间序列,例如。
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'])
现在,我想每天提取所有sub-dataframes,以获取以下输出:
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.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,但我需要在范围内将其排除
如果要按日期进行分组(aka:Year 个月 天),请使用df.index.date
:
result = [group[1] for group in df.groupby(df.index.date)]
作为df.index.day
,将使用本月的一天(即1至31)进行分组,如果输入数据框架日期延长了多个月,可能会导致不良行为。
也许是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)]
一定要爱Python!