python - 循环日期范围子+将天分配给各自的月份

标签 python pandas date datetime

非常感谢对此的帮助

对于以下数据集:


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/

相关文章:

python - pandas.merge 莫名其妙的慢

PHP 查找最小数字/日期的快捷方式

ios - DateFormatter 不返回 "HH:mm:ss"的日期

javascript - 使用语言环境解析时日期无效

python - Python 的列表、元组和字典的 Node.js 等效数据类型

python - 如何在另一种情况下在 Pandas 中创建滚动窗口

python - 在python中匹配两个 Pandas 数据框的列名

python - 如何将多列初始化为现有的 pandas DataFrame

python - 编号的计算满足条件的行(来自 csv 的数据)和较慢的代码

python-3.x - 使用 groupby 从 Dataframe 中堆积条形图