将 Dataframe 从每月重采样到每天
Resampling Dataframe from Monthly to Daily
这是我的问题:
这是我的 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 的所有名称固定,将系列从每月到每日 DataFrame 重新采样(更改仅发生在每个月的月底,因此看起来像是使用 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 个名字。
这个我已经看过了 link
但这并不是同一个问题,我仍然没有找到任何解决方案来管理我的问题。
如果您有任何想法,欢迎您!
首先,确保您的 Date
列是 datetime
对象:
df['Date'] = df.Date.astype('datetime64')
然后,按Date
列分组,按天聚合list
、resample
并填充,最后执行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]
我会旋转数据并使用 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]
这是我的问题:
这是我的 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 的所有名称固定,将系列从每月到每日 DataFrame 重新采样(更改仅发生在每个月的月底,因此看起来像是使用 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 个名字。
这个我已经看过了 link
但这并不是同一个问题,我仍然没有找到任何解决方案来管理我的问题。 如果您有任何想法,欢迎您!
首先,确保您的 Date
列是 datetime
对象:
df['Date'] = df.Date.astype('datetime64')
然后,按Date
列分组,按天聚合list
、resample
并填充,最后执行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]
我会旋转数据并使用 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]