使用Pandas Groupby和date_range进行时间序列分析时出错

时间:2015-12-05 22:34:21

标签: python pandas networkx

我有一个类似于下面的Pandas DataFrame,我试图将DataFrame拆分为一周长的块,并在每个块上运行一个函数。我相信这应该可以通过groupbydate_range函数来完成,但我遇到了一些麻烦。

我见过其他人用日期作为索引做类似的事情。但是,这在这种情况下不起作用,因为df中的多行可能具有相同的日期。此外,每个日期都没有在df中表示。

groupby和/或date_range函数我做错了什么?

一旦我明白这一点,我想使用nx.from_pandas_dataframe为每周长的块创建一个网络,并计算每个块中的节点数。

# create list of edges with 'source', 'target', 'timestamp'
edges = [('e', 'a1', '12/02/2015'),
         ('e', 'a2', '12/02/2015'),
         ('e', 'a3', '12/03/2015'),
         ('e', 'a4', '12/04/2015'),
         ('e', 'a5', '12/04/2015'),
         ('e', 'a1', '12/08/2015'),
         ('e', 'a2', '12/09/2015'),
         ('e', 'a6', '12/09/2015'),
         ('e', 'a7', '12/13/2015'),
         ('e', 'a1', '12/15/2015'),
         ('e', 'a6', '12/16/2015'),
         ('e', 'a8', '12/17/2015'),
         ('e', 'a9', '12/18/2015')]

# create a DataFrame from edges
df = pd.DataFrame(edges, columns=['source', 'target', 'date'], )

# sort df by date and identify first and last date
df.sort(columns=['date'], ascending=True, inplace=True)
first_date = df.date.irow(0)
last_date = df.date.irow(-1)

df.groupby(pd.date_range(start=first_date, end=last_date, freq='W'))
AssertionError: Grouper and axis must be same length

1 个答案:

答案 0 :(得分:1)

可能有更好的,但这是一个解决方案。我创建了一个键入年/周元组对的数据帧字典。

首先,我在年/周元组对的数据框中创建一个列。然后我使用词典理解来分组这个专栏。

df['year_week'] = [(d.year, d.week) for d in df['date']]

weekly_groups = {w: g for w, g in df.groupby('year_week')}
>>> weekly_groups
{(2015, 49):   source target       date   year_week
 0      e     a1 2015-12-02  (2015, 49)
 1      e     a2 2015-12-02  (2015, 49)
 2      e     a3 2015-12-03  (2015, 49)
 3      e     a4 2015-12-04  (2015, 49)
 4      e     a5 2015-12-04  (2015, 49),
 (2015, 50):   source target       date   year_week
 5      e     a1 2015-12-08  (2015, 50)
 6      e     a2 2015-12-09  (2015, 50)
 7      e     a6 2015-12-09  (2015, 50)
 8      e     a7 2015-12-13  (2015, 50),
 (2015, 51):    source target       date   year_week
 9       e     a1 2015-12-15  (2015, 51)
 10      e     a6 2015-12-16  (2015, 51)
 11      e     a8 2015-12-17  (2015, 51)
 12      e     a9 2015-12-18  (2015, 51)}