我有看起来像这样的数据。每行代表某个日期该 ID 的一个值。
ID Date Value
A 2012-01-05 50
A 2012-01-08 100
A 2012-01-10 200
B 2012-07-01 10
B 2012-07-03 20
Run Code Online (Sandbox Code Playgroud)
我需要扩展它,以便我整天都有行。每天的值应该是前一天的值(即,将上面的数据视为值的更新,将下面的数据视为值的时间序列)。
ID Date Value
A 2012-01-05 50
A 2012-01-06 50
A 2012-01-07 50
A 2012-01-08 100
A 2012-01-09 100
A 2012-01-10 200
B 2012-07-01 10
B 2012-07-02 10
B 2012-07-03 20
Run Code Online (Sandbox Code Playgroud)
目前,我有一个解决方案,相当于以下内容:
它有效,但似乎是一个非常糟糕的蛮力解决方案。我想知道 Pandas 是否支持更好的方法?
假设我有一个这样的开始和结束日期:
start_d = datetime.date(2017, 7, 20)
end_d = datetime.date(2017, 9, 10)
Run Code Online (Sandbox Code Playgroud)
我希望获得一个如下所示的 Pandas DataFrame:
Month NumDays
2017-07 12
2017-08 31
2017-09 10
Run Code Online (Sandbox Code Playgroud)
它显示了我的范围中包含的每个月的天数。
到目前为止,我可以使用pd.date_range(start_d, end_d, freq='MS').
假设我有一个这样的 DataFrame:
date id val
0 2017-01-01 1 10
1 2019-01-01 1 20
2 2017-01-01 2 50
Run Code Online (Sandbox Code Playgroud)
我想按id.
对于每个组,我想向其中添加一个新行,日期为从现在起 1 年。仅当该行晚于组中的最后一个日期时,才应添加该行。该行的 val 应与组中的最后一行相同。
决赛桌应如下所示:
date id val
0 2017-01-01 1 10
1 2019-01-01 1 20
2 2017-01-01 2 50
3 2018-09-25 2 50 <-- new row
Run Code Online (Sandbox Code Playgroud)
当前代码如下。我可以得到一个掩码,显示哪些组需要附加一行,但不确定接下来要做什么。
>>> df = pd.DataFrame(data={'d': [datetime.date(2017, 1, 1), datetime.date(2019,1,1), datetime.date(2017,1,1)], 'id': [1,1,2], 'val': [10,20,50]})
>>> df = df.sort_values(by='d')
>>> future_date = (pd.datetime.now().date() + pd.DateOffset(years=1)).date()
>>> maxd = df.groupby('id')['d'].max()
>>> maxd < future_date …Run Code Online (Sandbox Code Playgroud) 我有以下数据帧。
>>> df = pd.DataFrame(data={'date': ['2010-05-01', '2010-07-01', '2010-06-01', '2010-10-01'], 'id': [1,1,2,2], 'val': [50,60,70,80], 'other': ['uno', 'uno', 'dos', 'dos']})
>>> df['date'] = df['date'].apply(lambda d: pd.to_datetime(d))
>>> df
date id other val
0 2010-05-01 1 uno 50
1 2010-07-01 1 uno 60
2 2010-06-01 2 dos 70
3 2010-10-01 2 dos 80
Run Code Online (Sandbox Code Playgroud)
我想扩展这个 DataFrame 以便它包含 2010 年所有月份的行。
id,因此每个 id 将有 12 行。在本例中,共有 24 行。val在每月,如果从最初的数据帧不存在,应为0。other与 有一对一的关系id,所以我想保持这种方式。我想要的结果如下:
date id other val
0 …Run Code Online (Sandbox Code Playgroud)