[英]How to divide a date range into 365 day periods in a python pandas data frame
I have a pandas data frame which contains data that looks like below我有一个 pandas 数据框,其中包含如下所示的数据
import pandas as pd
data = [['0','2018-03-01','2020-04-11'],['1','2017-11-17','2020-11-16'],['2','2017-07-12','2020-07-12']]
df = pd.DataFrame(data,columns=['account_number','contract_start_date','contract_end_date'])
df
I need to break each account's contract into 365 day periods using the contract_start_date and contract_end_date.我需要使用 contract_start_date 和 contract_end_date 将每个帐户的合同分成 365 天的时间段。 The last period needs to contain whatever days remain.
最后一个期间需要包含剩余的任何天数。 An example of that is below
下面是一个例子
what I have tried so far: I tried to create a new data frame and thought I could generate the 365 periods using date ranges.到目前为止我尝试过的:我尝试创建一个新的数据框,并认为我可以使用日期范围生成 365 个周期。 It hasn't worked as I hoped.
它没有像我希望的那样工作。 Would appreciate any guidance.
将不胜感激任何指导。
new_df= pd.concat([pd.DataFrame({'start_date': pd.date_range(row.contract_start_date, row.contract_end_date, freq ='365D'),
'account_number': row.account_number
}) for row in df.itertuples()], ignore_index=True)
new_df
There are leaps years, so output is different.有闰年,所以output不一样。
Idea is mapped last values by Series.duplicated
in new account_number
by original contract_end_date
and for another values are added 365 days
: Idea 由
Series.duplicated
映射到原始contract_end_date
的新account_number
中的最后一个值,并为另一个值添加365 days
:
s1 = pd.to_datetime(df.set_index('account_number')['contract_end_date'])
s2 = new_df['account_number'].map(s1)
s3 = new_df['start_date'] + pd.Timedelta(365, 'd')
mask = new_df['account_number'].duplicated(keep='last')
new_df['contract_end_date'] = np.where(mask, s3, s2)
new_df['days'] = new_df['contract_end_date'] - new_df['start_date']
print (new_df)
start_date account_number contract_end_date days
0 2018-03-01 0 2019-03-01 365 days
1 2019-03-01 0 2020-02-29 365 days
2 2020-02-29 0 2020-04-11 42 days
3 2017-11-17 1 2018-11-17 365 days
4 2018-11-17 1 2019-11-17 365 days
5 2019-11-17 1 2020-11-16 365 days
6 2020-11-16 1 2020-11-16 0 days
7 2017-07-12 2 2018-07-12 365 days
8 2018-07-12 2 2019-07-12 365 days
9 2019-07-12 2 2020-07-11 365 days
10 2020-07-11 2 2020-07-12 1 days
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.