python - 如何使用熊猫将行的开始日期和结束日期转换为每月块?
问题描述
这是我拥有的数据集
id start end
0 A 1-Jan-19 31-Dec-19
1 A 1-Jan-20 31-Dec-20
2 B 13-Jun-19 19-Nov-19
df = pd.DataFrame({'id': ["A", "A", "B"],
'start': ["1-Jan-19", "1-Jan-20", "13-Jun-19"],
'end': ["31-Dec-19", "31-Dec-20", "19-Nov-19"]})
这是我需要的数据集
id start end
0 A 1-Jan-19 31-Jan-19
1 A 1-Feb-19 28-Feb-19
2 A 1-Mar-19 31-Mar-19
3 A 1-Apr-19 30-Apr-19
4 A 1-May-19 31-May-19
5 A 1-Jun-19 30-Jun-19
6 A 1-Jul-19 31-Jul-19
7 A 1-Aug-19 31-Aug-19
8 A 1-Sep-19 30-Sep-19
9 A 1-Oct-19 31-Oct-19
10 A 1-Nov-19 30-Nov-19
11 A 1-Dec-19 31-Dec-19
12 B 13-Jun-19 30-Jun-19
13 B 1-Jul-19 31-Jul-19
14 B 1-Aug-19 31-Aug-19
15 B 1-Sep-19 30-Sep-19
16 B 1-Oct-19 31-Oct-19
17 B 1-Nov-19 19-Nov-19
数据按 id 分组,时间块分布在几个月中。我尝试使用 resample 和 bfill Pandas 方法没有成功。是否可以使用 Pandas 执行此操作,或者我是否需要通过对日期系列进行合并并过滤日期重叠的位置来解决方法?
谢谢
解决方案
这是解决方案。
from dateutil.relativedelta import relativedelta
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'id': ["A", "A", "B"],
'start': ["1-Jan-19", "1-Jan-20", "13-Jun-19"],
'end': ["31-Dec-19", "31-Dec-20", "19-Nov-19"]})
df1["start"] = df1["start"].apply(lambda x: datetime.strptime(x, "%d-%b-%y") )
df1["end"] = df1["end"].apply(lambda x: datetime.strptime(x, "%d-%b-%y") )
df1["rows"] = abs((df1["start"]-df1["end"])/np.timedelta64(1,'M')).astype(int)
df_new = pd.DataFrame([df1.ix[idx]
for idx in df1.index
for i in range(df1.ix[idx]['rows'] +1)])
df_new = df_new.reset_index(drop=True)
groups = df_new.groupby(["start", "end"],as_index = False)
grouped_df = groups.apply(lambda x: x.reset_index(drop = True)).reset_index().drop('level_0',axis = 1)
grouped_df["start"] =grouped_df.apply(lambda row : row["start"]+ relativedelta(months=row["level_1"]), axis =1)
grouped_df.drop(['level_1', 'rows'], axis =1 ,inplace = True)
grouped_df
我假设您跳过了第二个输入行的处理。
如果不是这种情况,请告诉我。
输入:
输出 :
推荐阅读
- amazon-web-services - 如何使用从一个 Terraform 计划创建到另一个 Terraform 计划的 VPC id 和子网 id 值
- python - 在 tkinter 中,为什么 IntVar/Entry 的组合在使用零填充时返回错误的整数?
- c# - UWP StreamSocket connectAsync 与其他网络接口(Windows 到 VM Ware 网络)
- php - 无法为 Symfony 4 安装 SonataAdminBundle
- c# - 客户端库生产者在 .NET 4.0 中向 KAFKA 代理发送消息
- python - python 正则表达式帮助未知,直到**自我解决**
- python - 无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量
- session - ASP.Net Core 2.1 API JWT 无 cookie 会话?
- terminal - 获取 curses 应用程序的屏幕截图
- laravel - 如何暂停或延迟 Horizon 队列上的所有作业