【发布时间】:2020-07-05 17:06:10
【问题描述】:
这是我最近在一个程序中遇到的一个计算:
给定 2 个日期和一个明暗周期,计算这些日期之间发生的明暗周期的(分数)数。
def foo(start_date, end_date, lights_on, lights_off):
#stuff...
return (daytimes, nighttimes)
-
start_date和end_date是具有(至少)分钟精度的日期时间对象 -
lights_on和lights_off是int,分别代表一天中灯打开和关闭的时间。这些定义了“开灯”和“关灯”期间的持续时间。 -
lights_on和lights_off可以不均匀地划分一天(即不一定是 12H 亮:12H 暗),并且 光周期不必匹配 "true " 白天和晚上(例如,可以在早上 7 点关灯,在晚上 7 点打开灯)。但是,假设光照周期是恒定的(即想象房间或建筑物中的灯,而不是日出/日落),并且灯总是会在交替时打开或关闭小时(例如,晚上 8:30 不能改变灯光)。 - 结果应该是
float表示 2 个日期之间已完成的亮灯时间和熄灯时间的数量。 - 您可以假设日期相隔不到一个月,在 DST 不变的时期内。
例子:
import pandas as pd
date1 = pd.Timestamp(year=2020, month=1, day=1, hour=9, minute=0)
date2 = pd.Timestamp(year=2020, month=1, day=3, hour=13, minute=0)
date3 = pd.Timestamp(year=2020, month=1, day=5, hour=20, minute=47)
foo(date1, date2, 9, 17)
#returns (2.5, 2)
foo(date1, date3, 9, 17)
#returns (5, 4.236...)
foo(date1, date2, 19, 7)
#returns (2, 2.333...)
解释:
- 光周期为 9:00 到 17:00,有 2.5 个完成光周期(1 月 1 日 9:00 到 17:00,1 月 9:00 到 17:00 2 日,以及 1 月 3 日 9:00 至 13:00)和 2 个在
date1和 @987654332 之间完成的黑暗期(1 月 1 日的整个晚上和 1 月 2 日的整个晚上) @。 - 光照周期为 9:00 到 17:00,有 5 个完成的光照周期(1 月 1 日、2 日、3 日、4 日和 5 日的 9:00 到 17:00)和 4.236.. 完成黑暗期(1 月 1 日、2 日、3 日和 4 日的整个晚上,然后从 17:00 到 20:47 再增加 3 小时 47 分钟的黑暗,这是
date1和date3之间的一个暗周期长度的 0.236... 倍。 -
光照周期为 19:00 到 7:00,有 2 个完成的光照周期(19:00 到 7: 1 月 1 日和 2 日晚上 00 点)和 2.333.. 完成黑暗期(1 月 1 日从 9:00 到 17:00 的黑暗周期的 10/12 + 黑暗的 12/12 1 月 2 日从 7:00 到 17:00 的周期 + 1 月 3 日从 7:00 到 13:00 的黑暗周期的 6/12 = 28/12 = 2.333 ......)在
date1和date2之间.
对我来说,这种计算很容易概念化,但很难编码。我有一个可行的答案(在下面发布),但我为此苦苦挣扎了很长时间,并希望看到不同的更好的方法。如果有可以使用的现有库,那就太好了,只要输出正确,我不在乎数据的表示方式是否不同。
【问题讨论】: