<p>熊猫有一些很有前景的发声功能:
<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.between_time.html" rel="nofollow noreferrer">pandas.DataFrame.between_time</a>和<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DatetimeIndex.indexer_between_time.html" rel="nofollow noreferrer">pandas.DatetimeIndex.indexer_between_time</a></p>
<p>不幸的是,<code>between_time</code>返回的是数据帧,而不是布尔序列。因此与<code>.loc</code>一起使用并不方便</p>
<p>和<code>indexer_between_time</code>返回索引位置的整数数组。与<code>.iloc</code>一起工作,但这对我们来说非常不舒服</p>
<p>此外,它们都要求索引为DateTime类型</p>
<p>首先,一些示例数据:</p>
<pre class="lang-py prettyprint-override"><code>df = pd.DataFrame(pd.date_range(start = "2020-11-19 00:00",
end = "2020-11-19 23:59",
periods = 15),
columns = ["start"])
</code></pre>
<pre><code> start
0 2020-11-19 00:00:00
1 2020-11-19 01:42:47
2 2020-11-19 03:25:34
3 2020-11-19 05:08:21
4 2020-11-19 06:51:08
5 2020-11-19 08:33:55
6 2020-11-19 10:16:42
7 2020-11-19 11:59:30
8 2020-11-19 13:42:17
9 2020-11-19 15:25:04
10 2020-11-19 17:07:51
11 2020-11-19 18:50:38
12 2020-11-19 20:33:25
13 2020-11-19 22:16:12
14 2020-11-19 23:59:00
</code></pre>
<p>添加一个新列,如果一行是<code>Daytime</code>或不是,该列将显示为True/False</p>
<pre class="lang-py prettyprint-override"><code>df["Daytime"] = False
</code></pre>
<p>将索引设置为开始,日期时间列:</p>
<pre class="lang-py prettyprint-override"><code>df = df.set_index("start")
</code></pre>
<pre><code> Daytime
start
2020-11-19 00:00:00 False
2020-11-19 01:42:47 False
2020-11-19 03:25:34 False
2020-11-19 05:08:21 False
2020-11-19 06:51:08 False
2020-11-19 08:33:55 False
2020-11-19 10:16:42 False
2020-11-19 11:59:30 False
2020-11-19 13:42:17 False
2020-11-19 15:25:04 False
2020-11-19 17:07:51 False
2020-11-19 18:50:38 False
2020-11-19 20:33:25 False
2020-11-19 22:16:12 False
2020-11-19 23:59:00 False
</code></pre>
<p>时间戳的边界是什么</p>
<pre class="lang-py prettyprint-override"><code>DayStart = "06:30:00"
DayEnd = "18:00:00"
</code></pre>
<p>正在创建匹配行的整数数组。您还可以将<code>include_start</code>和<code>include_end</code>设置为具有打开或关闭的间隔</p>
<pre class="lang-py prettyprint-override"><code>DayTime = df.index.indexer_between_time(DayStart, DayEnd)
</code></pre>
<p>我们能得到什么回报?与索引位置匹配的整数列表</p>
<pre class="lang-py prettyprint-override"><code>>>> array([ 4, 5, 6, 7, 8, 9, 10])
</code></pre>
<p>我们现在可以使用它将第0列设置为<code>True</code>:</p>
<pre class="lang-py prettyprint-override"><code>df.iloc[DayTime,0] = True
</code></pre>
<pre><code> Daytime
start
2020-11-19 00:00:00 False
2020-11-19 01:42:47 False
2020-11-19 03:25:34 False
2020-11-19 05:08:21 False
2020-11-19 06:51:08 True
2020-11-19 08:33:55 True
2020-11-19 10:16:42 True
2020-11-19 11:59:30 True
2020-11-19 13:42:17 True
2020-11-19 15:25:04 True
2020-11-19 17:07:51 True
2020-11-19 18:50:38 False
2020-11-19 20:33:25 False
2020-11-19 22:16:12 False
2020-11-19 23:59:00 False
</code></pre>
<p>使用<code>between_time</code>函数返回与条件匹配的数据帧:</p>
<pre class="lang-py prettyprint-override"><code>df_DayFilter = df.between_time(DayStart, DayEnd)
</code></pre>
<pre><code> Daytime
start
2020-11-19 06:51:08 True
2020-11-19 08:33:55 True
2020-11-19 10:16:42 True
2020-11-19 11:59:30 True
2020-11-19 13:42:17 True
2020-11-19 15:25:04 True
2020-11-19 17:07:51 True
</code></pre>
<p>我也很想知道是否有更优雅的方法来使用<code>between_time</code></p>