使用Pandas生成“工作时间”区间索引

3

使用pandas,我们可以做类似于这样的事情:

>>> i1 = pandas.Interval(pandas.Timestamp('2021-08-25 09:00:00'), pandas.Timestam
p('2021-08-25 18:00:00'))
>>> i2 = pandas.Interval(pandas.Timestamp('2021-08-26 09:00:00'), pandas.Timestam
p('2021-08-26 18:00:00'))
>>> ii = pandas.IntervalIndex([i1, i2])
>>> ii
IntervalIndex([(2021-08-25 09:00:00, 2021-08-25 18:00:00], (2021-08-26 09:00:00, 
2021-08-26 18:00:00]],
              closed='right',
              dtype='interval[datetime64[ns]]')

这样我们就可以得到一个人两天工作时间的区间索引。但这很繁琐,而且不太DRY(想象一下为整个月的所有工作日创建这样的索引)。 问题是是否可能用更少的代码来做同样的事情?也许可以通过使用pandas.interval_range来完成,就像我们使用pandas.date_range一样。
>>> pandas.date_range(date(2021, 1, 1), date(2021, 7, 1), freq='B')
DatetimeIndex(['2021-01-01', '2021-01-04', '2021-01-05', '2021-01-06',
               '2021-01-07', '2021-01-08', '2021-01-11', '2021-01-12',
               '2021-01-13', '2021-01-14',
               ...
               '2021-06-18', '2021-06-21', '2021-06-22', '2021-06-23',
               '2021-06-24', '2021-06-25', '2021-06-28', '2021-06-29',
               '2021-06-30', '2021-07-01'],
              dtype='datetime64[ns]', length=130, freq='B')
1个回答

2

IntervalIndex.from_arrays 可以接受 leftright 边界的数组,因此您可以使用 date_range 生成这些边界:

in_times = pd.date_range('2021-08-25 09:00:00', '2021-09-25 09:00:00', freq='B')
out_times = pd.date_range('2021-08-25 18:00:00', '2021-09-25 18:00:00', freq='B')

ii = pd.IntervalIndex.from_arrays(left=in_times, right=out_times)
# IntervalIndex([(2021-08-25 09:00:00, 2021-08-25 18:00:00],
#                (2021-08-26 09:00:00, 2021-08-26 18:00:00],
#                (2021-08-27 09:00:00, 2021-08-27 18:00:00],
#                ...
#                (2021-09-22 09:00:00, 2021-09-22 18:00:00],
#                (2021-09-23 09:00:00, 2021-09-23 18:00:00],
#                (2021-09-24 09:00:00, 2021-09-24 18:00:00]],
#               dtype='interval[datetime64[ns], right]')

请注意,默认情况下这些区间仅右闭:
# (2021-08-25 09:00:00, 2021-08-25 18:00:00]

如果需要的话,可以添加 closed='both'
# [2021-08-25 09:00:00, 2021-08-25 18:00:00]

2
然后我可以使用类似这样的代码 ```>>> start = pd.date_range('2021-08-25 09:00:00', '2021-09-25 09:00:00', freq='B')
stop = pd.date_range('2021-08-25 18:00:00', '2021-09-25 18:00:00', freq='B')``` 并仅获取工作日的时间间隔。太棒了,谢谢!
- RealGecko
1
不用谢!我之前也不知道有“工作日”频率设置,所以我也学到了新东西。 - tdy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接