【发布时间】:2019-12-10 20:29:47
【问题描述】:
我有两个日期列“StartDate”和“EndDate”。我想找到从 2019 年 12 月开始的这两个日期之间每个月的天数,并忽略 2019 年之前的任何月份进行计算。每行的 StartDate 和 EndDate 可以跨越 2 年,月份重叠,Date 列也可以为空。
样本数据:
df = {'Id': ['1','2','3','4','5','6','7', '8'],
'Item': ['A','B','C','D','E','F','G', 'H'],
'StartDate': ['2019-12-10', '2019-12-01', '2019-10-01', '2020-01-01', '2019-03-01','2019-03-01','2019-10-01', ''],
'EndDate': ['2020-02-21' ,'2020-01-01','2020-08-31','2020-01-30','2019-12-31','2019-12-31','2020-08-31', '']
}
df = pd.DataFrame(df,columns= ['Id', 'Item','StartDate','EndDate'])
预期的 O/P:
以下解决方案部分有效。
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
def days_of_month(x):
s = pd.date_range(*x, freq='D').to_series()
return s.resample('M').count().rename(lambda x: x.month)
df1 = df[['StartDate', 'EndDate']].apply(days_of_month, axis=1).fillna(0)
df_final = df[['StartDate', 'EndDate']].join([df['StartDate'].dt.year.rename('Year'), df1])
【问题讨论】:
-
输出的倒数第二行对于前几列似乎是错误的。此外,您的第一行的 12 月 19 日与您计算其余日期的方式不一致。 IE。如果 12/1 到 12 月底是 31 天,那么 12/10 到 12 月底应该是 22 天
-
2020 年 2 月也有 29 天,所以整个专栏似乎都错了。
标签: python pandas numpy dataframe