在Python中,根据另一列中的值进行日期-时间舍入

2024-06-16 10:10:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图根据传感器的类型将传感器数据的时间戳舍入到最近的5分钟。我有一个名为“传感器类型”的专栏,有两个选项:“空气”或“声音”。对于空气传感器类型,时间戳应四舍五入至最接近的5分钟。传感器类型声音的时间戳应保持不变

根据这条规则,所有时间戳都四舍五入到5分钟,这是有效的

df['timestamp'] = df['timestamp'].dt.round('5min')

使用下面的遮罩,选择所有空气传感器类型

mask = df['sensor type'] == 'air'

事实上,我应该结合这两个规则来得到我想要的。然而,我无法管理它是如何工作的。 下面的规则给出了一个错误“TypeError:不支持使用DataFrame索引系列,请使用适当的DataFrame列”

mask = df.loc[df['sensor type'] == 'air']

df[‘timestamp’][mask] = df[‘timestamp'][mask].dt.round('5min')

dtypes:
timestamp        datetime64[ns]
sensor type              object

我希望有人能帮我把这两条线结合起来


Tags: 声音类型dataframedf规则type时间dt
2条回答

除了前面的答案,您还可以尝试以下内容-

import pandas as pd

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' : ['sound', 'air', 'sound', 'air', 'sound']})

df["timestamp"] = pd.to_datetime(df.timestamp)
df
mask = df['sensor'] == 'air'
df.loc[mask, 'timestamp'] = df.loc[mask, 'timestamp'].dt.round('5min')

enter image description here

如果您想为每个sensor type做一些可能稍有不同的事情,您可以使用^{}将它们分组在一起

根据您的示例数据,以下将时间戳全部舍入到最接近的5秒时间戳(对于您的示例,秒显示的结果优于分钟):

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']})

将时间戳转换为实际的时间戳类型(默认为字符串):

In [3]: df["timestamp"] = pd.to_datetime(df.timestamp)

Groupby传感器类型并对每个子数据帧执行舍入方法,将结果放入原始数据帧的新列中:

In [4]: df["rounded_timestamp"] = df.groupby("sensor type").transform(lambda d: d.dt.round("5s"))

如果您想对每个子数据帧执行非常具体的操作,可以实现一个小函数,而不是使用匿名lambda函数

请注意从timestamprounded_timestamp列的舍入值:

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

我假设您现在也可能拥有或创建其他列,因此我通常也会将dataframe的索引作为用例最重要的时间戳,因为这样您就可以访问^{}的一些强大属性和方法:

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

相关问题 更多 >