【问题标题】:How to divide a date range into 365 day periods in a python pandas data frame如何在 python pandas 数据框中将日期范围划分为 365 天
【发布时间】:2020-09-01 06:33:47
【问题描述】:

我有一个 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

我需要使用contract_start_date 和contract_end_date 将每个账户的合约分成365 天。最后一个时期需要包含剩余的任何天数。下面是一个例子

到目前为止我所尝试的: 我试图创建一个新的数据框,并认为我可以使用日期范围生成 365 个周期。它没有像我希望的那样工作。非常感谢任何指导。

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

【问题讨论】:

  • 您是否考虑过闰年?
  • @DerekO 我需要 365 天的周期,中间是否有闰年(例如 2020 年)并不重要

标签: python pandas date


【解决方案1】:

有闰年,所以产量不同。

想法由Series.duplicated 映射到新的account_number 中的最后一个值,由原始contract_end_date 和其他值添加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
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2021-05-09
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多