【问题标题】:pandas: how to count values in a selected by condition time frame windowpandas:如何在按条件选择的时间范围窗口中计算值
【发布时间】:2019-10-09 19:20:59
【问题描述】:

对于每个值('X' 列),我们都有定义为 ['T1', 'T2'] 的时间框架窗口:

df = pd.DataFrame({'X': [1, 1, 1, 3, 3, 3],
                   'T1': ['2015-12-30 22:30:00',
                          '2015-12-30 22:30:15',
                          '2015-12-30 22:30:20',
                          '2015-11-30 23:40:00',
                          '2015-11-30 23:42:00',
                          '2015-11-30 23:40:00'],
                   'T2': ['2015-12-30 22:31:00',
                          '2015-12-30 22:30:45',
                          '2015-12-30 22:30:20',
                          '2015-11-30 23:43:00',
                          '2015-11-30 23:42:50',
                          '2015-11-30 23:44:00'], 
                   })
    X   T1                      T2
0   1   2015-12-30 22:30:00     2015-12-30 22:31:00
1   1   2015-12-30 22:30:15     2015-12-30 22:30:45
2   1   2015-12-30 22:30:20     2015-12-30 22:30:20
3   3   2015-11-30 23:40:00     2015-11-30 23:43:00
4   3   2015-11-30 23:42:00     2015-11-30 23:42:50
5   3   2015-11-30 23:40:00     2015-11-30 23:44:00

我想计算相同的值('X'),其时间范围在(或等于)为此值定义的时间范围内,所以我想得到下一个结果:

df = pd.DataFrame({'X': [1, 1, 1, 3, 3, 3],
                   'T1': ['2015-12-30 22:30:00',
                          '2015-12-30 22:30:15',
                          '2015-12-30 22:30:20',
                          '2015-11-30 23:40:00',
                          '2015-11-30 23:42:00',
                          '2015-11-30 23:40:00'],
                   'T2': ['2015-12-30 22:31:00',
                          '2015-12-30 22:30:45',
                          '2015-12-30 22:30:20',
                          '2015-11-30 23:43:00',
                          '2015-11-30 23:42:50',
                          '2015-11-30 23:44:00'],
                   'count': [3, 2, 1, 2, 1, 3],
                   })
    X   T1                      T2                      count
0   1   2015-12-30 22:30:00     2015-12-30 22:31:00     3
1   1   2015-12-30 22:30:15     2015-12-30 22:30:45     2
2   1   2015-12-30 22:30:20     2015-12-30 22:30:20     1
3   3   2015-11-30 23:40:00     2015-11-30 23:43:00     2
4   3   2015-11-30 23:42:00     2015-11-30 23:42:50     1
    3   2015-11-30 23:40:00     2015-11-30 23:44:00     3

【问题讨论】:

  • 是否应该根据x列应用计数?
  • 是的,选择第一行 X=1 和 [2015-12-30 22:30:00, 015-12-30 22:31:00] 这个时间范围包括另外两个 X=1 : [2015-12-30 22:30:15, 2015-12-30 22:30:45] 和 [2015-12-30 22:30:20,2015-12-30 22:30:20] 所以首先我们有 count = 3 的行(拥有 X=1 和另外两个)
  • 看看编辑,我原谅了x 列在第一个答案上的匹配。干杯。

标签: python-3.x pandas datetime pandas-groupby


【解决方案1】:

您可以使用apply 完成此操作。

这是一种方法:

# Import module
import pandas as pd

# You dataframe
df = pd.DataFrame({ 'X': [1, 1, 1, 3, 3, 3],
                    'T1': ['2015-12-30 22:30:00',
                         '2015-12-30 22:30:15',
                         '2015-12-30 22:30:20',
                         '2015-11-30 23:40:00',
                         '2015-11-30 23:42:00',
                         '2015-11-30 23:40:00'],
                    'T2': ['2015-12-30 22:31:00',
                         '2015-12-30 22:30:45',
                         '2015-12-30 22:30:20',
                         '2015-11-30 23:43:00',
                         '2015-11-30 23:42:50',
                         '2015-11-30 23:44:00'], 
                   })

# Convert columns to datetime object
df["T1"] = pd.to_datetime(df.T1, format="%Y-%m-%d %H:%M:%S")
df["T2"] = pd.to_datetime(df.T2, format="%Y-%m-%d %H:%M:%S")

# Function to comptute the number of element in the interval
def countIntervals(row):
    return len(df[(df.X == row.X) & (df.T1 >= row.T1) & (df.T2 < row.T2)]) + 1

# Add new column
df["count"] = df.apply(countIntervals, axis=1)
print(df)
#    X                  T1                  T2  count
# 0  1 2015-12-30 22:30:00 2015-12-30 22:31:00      3
# 1  1 2015-12-30 22:30:15 2015-12-30 22:30:45      2
# 2  1 2015-12-30 22:30:20 2015-12-30 22:30:20      1
# 3  3 2015-11-30 23:40:00 2015-11-30 23:43:00      2
# 4  3 2015-11-30 23:42:00 2015-11-30 23:42:50      1
# 5  3 2015-11-30 23:40:00 2015-11-30 23:44:00      3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 2021-10-31
    • 2019-09-07
    相关资源
    最近更新 更多