非常感谢对此的帮助
对于以下数据集:
StartDate EndDate Days 0 2018-03-20 00:36:00 2018-05-01 00:42:00 42.004167 1 2018-05-01 00:42:00 2018-06-04 17:15:38 34.690023 2 2018-04-07 15:06:00 2018-05-09 17:01:00 32.079861 3 2018-03-21 04:36:00 2018-05-14 04:00:00 53.975000 4 2018-03-15 15:30:00 2018-05-08 08:30:00 53.708333 5 2018-05-08 08:30:00 2018-06-09 10:40:09 32.090382 6 2018-03-21 09:00:00 2018-05-16 13:40:00 56.194444 7 2018-03-31 06:00:00 2018-05-26 16:30:00 56.437500 8 2018-03-14 18:18:00 2018-04-27 01:00:00 43.279167 9 2018-04-07 15:00:00 2018-06-01 09:25:50 54.767940 10 2018-03-22 07:30:00 2018-05-20 19:00:00 59.479167
I was able to find the difference between the start and end dates and create the new column ‘Days’ like so:
df['StartDate'] = pd.to_datetime(df['StartDate'])
df['EndDate'] = pd.to_datetime(df['EndDate'])
df['Days'] = df['EndDate'].sub(df['StartDate'], axis=0)
df['Days'] = df['Days'] / np.timedelta64(1, 'D')
<小时/>
但是我需要找出这个:
对于每一行,每个月有多少天以及它们所在的特定月份。
我认为最好的方法是为所有可能的月份创建列,并以这种方式将日期归因于各自的列。但我有 Excel 背景,可能有更聪明的方法。
原因是;根据开始日期和结束日期之间的工作天数正确地向客户支付费用,并在此基础上归因于他们的成本。完整数据集相当大,因此脚本必须以有效的方式处理各种日期差异。
谢谢
黑曼巴
最佳答案
让我们试试这个。
首先使用 pd.date_range
创建一系列日期,并为每条记录指定 StartDate 和 EndDate。接下来使用 dt 日期时间访问器来获取月份。使用 value_counts
计算每条记录的总月份数。最后,将结果连接到原始数据帧。另外,通过使用 rename
和从 calendar.month_names
创建的字典,导入日历
来获取月份名称与数字。
import calendar
df.join(df.apply(lambda x:
pd.Series(pd.date_range(x.StartDate,
x.EndDate,
freq='D')).dt.month,1)
.apply(lambda x:
x.value_counts(),1)
.rename(columns=dict(enumerate(calendar.month_name))))
输出:
StartDate EndDate Days March April May June
0 2018-03-20 00:36:00 2018-05-01 00:42:00 42.004167 12.0 30.0 1.0 NaN
1 2018-05-01 00:42:00 2018-06-04 17:15:38 34.690023 NaN NaN 31.0 4.0
2 2018-04-07 15:06:00 2018-05-09 17:01:00 32.079861 NaN 24.0 9.0 NaN
3 2018-03-21 04:36:00 2018-05-14 04:00:00 53.975000 11.0 30.0 13.0 NaN
4 2018-03-15 15:30:00 2018-05-08 08:30:00 53.708333 17.0 30.0 7.0 NaN
5 2018-05-08 08:30:00 2018-06-09 10:40:09 32.090382 NaN NaN 24.0 9.0
6 2018-03-21 09:00:00 2018-05-16 13:40:00 56.194444 11.0 30.0 16.0 NaN
7 2018-03-31 06:00:00 2018-05-26 16:30:00 56.437500 1.0 30.0 26.0 NaN
8 2018-03-14 18:18:00 2018-04-27 01:00:00 43.279167 18.0 26.0 NaN NaN
9 2018-04-07 15:00:00 2018-06-01 09:25:50 54.767940 NaN 24.0 31.0 NaN
10 2018-03-22 07:30:00 2018-05-20 19:00:00 59.479167 10.0 30.0 20.0 NaN
关于python - 循环日期范围子+将天分配给各自的月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50339364/