<p>如果您想为每个<code>sensor type</code>做一些可能稍有不同的事情,您可以使用<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html" rel="nofollow noreferrer"><strong>^{<cd2>}</strong></a>将它们分组在一起</p>
<p>根据您的示例数据,以下将时间戳全部舍入到最接近的<em>5秒</em>时间戳(对于您的示例,秒显示的结果优于分钟):</p>
<pre><code>In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'timestamp' : ['2020-04-14 00:00:23', '2020-04-14 00:00:37',
'2020-04-14 00:01:01', '2020-04-14 00:01:05',
'2020-04-14 00:01:19'],
'sensor type' : ['sound', 'air', 'sound', 'air', 'sound']})
</code></pre>
<p>将时间戳转换为实际的时间戳类型(默认为字符串):</p>
<pre><code>In [3]: df["timestamp"] = pd.to_datetime(df.timestamp)
</code></pre>
<p><code>Groupby</code>传感器类型并对每个子数据帧执行舍入方法,将结果放入原始数据帧的新列中:</p>
<pre><code>In [4]: df["rounded_timestamp"] = df.groupby("sensor type").transform(lambda d: d.dt.round("5s"))
</code></pre>
<p>如果您想对每个子数据帧执行非常具体的操作,可以实现一个小函数,而不是使用匿名lambda函数</p>
<p>请注意从<code>timestamp</code>到<code>rounded_timestamp</code>列的舍入值:</p>
<pre><code>In [5]: df
Out[5]:
timestamp sensor type rounded_timestamp
0 2020-04-14 00:00:23 sound 2020-04-14 00:00:25
1 2020-04-14 00:00:37 air 2020-04-14 00:00:35
2 2020-04-14 00:01:01 sound 2020-04-14 00:01:00
3 2020-04-14 00:01:05 air 2020-04-14 00:01:05
4 2020-04-14 00:01:19 sound 2020-04-14 00:01:20
</code></pre>
<hr/>
<p>我假设您现在也可能拥有或创建其他列,因此我通常也会将dataframe的索引作为用例最重要的时间戳,因为这样您就可以访问<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DatetimeIndex.html" rel="nofollow noreferrer"><strong>^{<cd6>}</strong></a>的一些强大属性和方法:</p>
<pre><code>In [6]: df.set_index("rounded_timestamp", drop=True, inplace=True)
In [7]: df
Out[7]:
timestamp sensor type
rounded_timestamp
2020-04-14 00:00:25 2020-04-14 00:00:23 sound
2020-04-14 00:00:35 2020-04-14 00:00:37 air
2020-04-14 00:01:00 2020-04-14 00:01:01 sound
2020-04-14 00:01:05 2020-04-14 00:01:05 air
2020-04-14 00:01:20 2020-04-14 00:01:19 sound
</code></pre>