【问题标题】:Resampling Dataframe from Monthly to Daily将数据框从每月重新采样到每天
【发布时间】:2020-09-19 23:16:00
【问题描述】:

这是我的问题:

这是我的 DataFrame 的一个示例(实际上是从 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 个名称,我真的不知道如何重新采样到每日 Dataframe 并且每天仍然有 5 个名称。

我已经看过这个链接了

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

但这并不是同一个问题,我仍然没有找到任何解决方案来管理我的问题。 如果您有任何想法,欢迎您!

【问题讨论】:

    标签: python pandas time-series resampling


    【解决方案1】:

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

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

    然后,按Date列分组,按天聚合名称为list、resample并填充,最后执行explode以扩展名称的lists:

    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]
    

    【讨论】:

      【解决方案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]
      

      【讨论】:

      • 非常感谢您的帮助!
      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 2021-08-04
      • 2018-04-25
      • 2023-03-19
      • 2022-01-22
      相关资源
      最近更新 更多