【问题标题】:Python Pandas, make date time rounding based on value in another columnPython Pandas,根据另一列中的值进行日期时间舍入
【发布时间】:2020-05-22 01:37:03
【问题描述】:

我只需要选择传感器类型 == 空气的情况,以四舍五入到最接近的 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)
In [4]: df["rounded_timestamp"] = df.groupby("sensor type").transform(lambda d: d.dt.round("5s"))

结果

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

因此,我确实有四舍五入时间的列。但仅对于空气传感器,时间应该四舍五入,我怎样才能得到一个带有空气传感器的圆形时间戳和声音传感器的非圆形时间戳的列?

【问题讨论】:

  • 你为什么使用groupby

标签: python pandas function


【解决方案1】:

解决此问题的一种方法是使用 apply() 函数到 DataFrame(不是系列)。如果您设置axis=1,它的作用是让您在每行的基础上进行操作。这样,您可以指定需要应用于一列的操作,但仍可以访问该行所需的任何其他列,以便有条件地应用这些操作。

df["rounded_timestamp"] = df.apply(lambda row: row["timestamp"].round("5s") 
                                   if row["sensor type"] == "air" 
                                   else row["timestamp"],
                                   axis=1)

【讨论】:

  • 感谢您的支持!但是,尽管属性类型设置为日期时间,但我确实收到错误“AttributeError:'Timestamp' 对象没有属性'dt'”。你知道如何克服这个问题吗?
  • 哦,抱歉。我没听懂。取出.dt。它是一个附件,可为您提供系列中包含的值,用于矢量化操作等。为此,row["timestamp"] 直接为您提供时间戳,因此无需访问器。
【解决方案2】:

只需使用这个(在现有代码中添加 1 多行):

编辑: 在 colab 上的 pandas 1.0.3 和 python 3.6.9 上测试

df['rounded_timestamp'] = df['timestamp']
df.loc[df['sensor type']=='air',"rounded_timestamp"] = df.loc[df['sensor type']=='air','timestamp'].dt.round("5s")

输出:

【讨论】:

  • 谢谢,但是我收到一个错误:“试图在数据帧中的切片副本上设置一个值。尝试使用 .loc[row_indexer,col_indexer] = value 代替”和脚本不工作...你知道如何克服吗?
  • 顺便说一句,你的熊猫版本是什么?我在 1.0.3 和 python 3.6.9 上的 colab 上对此进行了测试
  • 另外,您是否通过过滤另一个更大的数据框来创建此数据框?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2018-02-02
  • 2021-12-03
  • 2015-04-22
  • 1970-01-01
相关资源
最近更新 更多