Pandas按日期范围分组

6

我有一个表格,其中一列是发生日期(数据框没有按日期索引)

我想按日期分组表格,其中所有早于某个日期的项目都被分为一个桶。这需要是累积的,因此后面的桶将包括早期桶中的所有数据点。

这是我需要按组的日期范围对象:

date_rng = date_range('28/02/2010','31/08/2014',freq='3M')

这里有一个数据表中的几个数据点示例:
df_raw.head()
     Ticker   FY Periodicity  Measure     Val                Date
0  BP9DL90  2009         ANN     CPX  1000.00 2008-03-31 00:00:00
1  BP9DL90  2010         ANN     CPX   600.00 2009-03-25 00:00:00
2  BP9DL90  2010         ANN     CPX   600.00 2009-09-16 00:00:00
3  BP9DL90  2011         ANN     CPX   570.00 2010-03-17 00:00:00
4  BP9DL90  2011         ANN     GRM    57.09 2010-09-06 00:00:00

[5 rows x 6 columns]

任何意见都将不胜感激。
谢谢。

这里似乎不是“分组”(在pandas意义上)的正确方法。那是一种互斥的操作。你实际上想做什么?如果你想聚合任何列,可以考虑按日期索引,然后使用cumsum()pd.rolling_apply()来获得“运行总计”。 - Luciano
我想根据特定的标准筛选数据。其中一个标准是“截至x日期”。不想聚合数据。我不知道pandas groupby是互斥的 - 可能需要设置循环来手动创建主表的子集。 - user3294195
基于此,我首先会尝试使用日期作为索引读取数据(请参阅pd.read_csv()index_colparse_dates参数),然后您可以轻松地循环,如下所示:for d in date_range: print(df_raw[:d]),这将打印出截止到日期d的(子)表格。 - Luciano
1个回答

2

您可以创建一个函数,如果日期在所需的日期范围内,则返回1,并使用此函数进行分组:

# convert date column do datetime type
df['Date']=pd.to_datetime(df['DATE']), format='%d-%m-%Y %H:%M:%S'

def is_in_range(x):
   if x['Date'] > '28-02-2010 00:00:00' and x['Date'] < '31-08-2014 00:00:00':
       return 1
   else:
       return 0

data.groupby(df['date'].map(is_in_range))

谢谢...实际上我想根据日期小于date_rng中每个元素的项目设置分组。因此,每个date_rng元素将有一个桶。 - user3294195
好的,我明白了。我认为在 Pandas 的 groupby 中是无法有这样的累积分组的。 - yemu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接