从每月到每日重新采样数据帧

2024-04-25 05:10:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是:

这是我的数据帧的一个示例(它实际上是从2002年到2012年)

df = pd.DataFrame(
    {'Date':["2002-07-31","2002-07-31","2002-07-31","2002-07-31","2002-07-31","2002-08-31","2002-08-31","2002-08-31","2002-08-31","2002-08-31",'2002-09-30','2002-09-30','2002-09-30','2002-09-30','2002-09-30'],
     'Name': ["Paul", "John", "Silvia", "Mike", "Cindy","Paul", "David", "Harry", "Mike", "Britney","Francis", "Michael", "Charlie", "Joe", "Hilary"]})

这就是

       Date     Name
0   2002-07-31  Paul
1   2002-07-31  John
2   2002-07-31  Silvia
3   2002-07-31  Mike
4   2002-07-31  Cindy
5   2002-08-31  Paul
6   2002-08-31  David
7   2002-08-31  Harry
8   2002-08-31  Mike
9   2002-08-31  Britney
10  2002-09-30  Francis
11  2002-09-30  Michael
12  2002-09-30  Charlie
13  2002-09-30  Joe
14  2002-09-30  Hilary

我想通过保留2002-07-31到2002-08-30和2002-08-31到2002-09-30的所有名称,将序列从每月数据帧重新采样到每日数据帧(更改只发生在每个月底,因此看起来像是使用ffill()方法重新采样)

我想要的结果是这样的:

   Date     Name
2002-07-31  Paul
2002-07-31  John
2002-07-31  Silvia
2002-07-31  Mike
2002-07-31  Cindy
2002-08-01  Paul
2002-08-01  John
2002-08-01  Silvia
2002-08-01  Mike
2002-08-01  Cindy
2002-08-02  Paul
2002-08-02  John
2002-08-02  Silvia
2002-08-02  Mike
2002-08-02  Cindy
2002-08-03  Paul
2002-08-03  John
2002-08-03  Silvia
2002-08-03  Mike
2002-08-03  Cindy
.....

2002-08-31  Paul
2002-08-31  David
2002-08-31  Harry
2002-08-31  Mike
2002-08-31  Britney
2002-09-01  Paul
2002-09-01  David
2002-09-01  Harry
2002-09-01  Mike
2002-09-01  Britney
....

2002-09-30  Francis
2002-09-30  Michael
2002-09-30  Charlie
2002-09-30  Joe
2002-09-30  Hilary

正如你所看到的,名字只有在每个月底才会改变。 对我来说,最困难的一步是,我选择了5个名称,但我真的不知道如何对每日数据帧重新采样,并且每天仍然有5个名称

我已经看过这个链接了

Resampling Error : cannot reindex a non-unique index with a method or limit

但这其实不是同一个问题,我仍然没有找到任何解决办法来管理我的问题。 如果你有任何想法,欢迎


Tags: 数据namedatejohnmikedavidbritneyjoe
2条回答

我将透视数据并使用asfreq对数据进行采样,然后堆叠:

(df.assign(group=df.groupby('Date').cumcount())
  .set_index(['Date','group'])['Name']
  .unstack()
  .asfreq('D').ffill()
  .unstack()
  .reset_index('group',drop=True)
  .reset_index(name='Name')
)

输出:

          Date     Name
0   2002-07-31     Paul
1   2002-07-31     John
2   2002-07-31   Silvia
3   2002-07-31     Mike
4   2002-07-31    Cindy
..         ...      ...
305 2002-09-30  Francis
306 2002-09-30  Michael
307 2002-09-30  Charlie
308 2002-09-30      Joe
309 2002-09-30   Hilary

[310 rows x 2 columns]

首先,确保Date列是datetime对象:

df['Date'] = df.Date.astype('datetime64')

然后,按Date列分组,按天将名称聚合到listresample并填充,最后执行explode以扩展名称的list

df.groupby('Date').agg(list).resample('D').ffill().explode('Name').reset_index()

# Result:
          Date     Name
0   2002-07-31     Paul
1   2002-07-31     John
2   2002-07-31   Silvia
3   2002-07-31     Mike
4   2002-07-31    Cindy
..         ...      ...
305 2002-09-30  Francis
306 2002-09-30  Michael
307 2002-09-30  Charlie
308 2002-09-30      Joe
309 2002-09-30   Hilary

[310 rows x 2 columns]

相关问题 更多 >