我有一个带有节点,值和日期时间列的数据框。我想获取每个节点每个月的值从60增长到70所需的最大天数。如果该值保持在60以下或70以上,则该值应仅为0。如果该值未从60变为70或以上,则应为0。

df:

rng = pd.date_range('2019-01-01', periods=365, freq='D')
df= pd.DataFrame({'Date': rng, 'Val': np.random.randint(50, 80, size=365), 'Node': 'A'})
df.set_index('Date', inplace=True)


我已经将索引设置为节点,月份和日期,但是我不知道如何获取阈值之间的值计数。

df.set_index(['Node', df.index.month, df.index])['Val'].between(60, 70)


我认为答案应该是每个月应用两次之间的“ Val”列中的连续True值的最大数量。

输出应该是这样的数据框:

df = pd.DataFrame([
    {'Node': 'A', 'Month': 1, 'Count': 3},
    {'Node': 'A', 'Month': 2, 'Count': 5},
    {'Node': 'A', 'Month': 3, 'Count': 0},
    {'Node': 'B', 'Month': 1, 'Count': 5},
    {'Node': 'B', 'Month': 2, 'Count': 3},
    {'Node': 'B', 'Month': 3, 'Count': 2},
    ...
])

最佳答案

如果我理解正确,

一种想法是将groupby与常规cumsumcumcount一起使用来连续计数直到达到70天。

np.random.seed(0)
np.random.randint(50, 80, size=365)
rng = pd.date_range('2019-01-01', periods=365, freq='D')
df= pd.DataFrame({'Date': rng, 'Val': np.random.randint(50, 80, size=365), 'Node': 'A'})


df.sort_values('Date',inplace=True)

df['C'] = (df.loc[(df["Val"] > 60) & (df["Val"] <= 70)]
.groupby([df["Date"].dt.month, (df['Val'] == 70).cumsum()])).cumcount() + 1


因为我们只希望当月的值达到70,所以如果在给定的月份内未达到70,则需要将计数设置为0,因此我们可以按月过滤并将其返回到列表中,然后使用isin进行过滤

months = df.loc[df['Val'] == 70]['Date'].dt.month.tolist()
df.loc[~df['Date'].dt.month.isin(months),'C'] = 0
df1 = (df.groupby([df['Node'],df['Date'].dt.month])['C'].max()
        .reset_index().rename(columns={'Date' : 'Month'}))
    print(df1)


    Node  Month     C
0     A      1   0.0
1     A      2   6.0
2     A      3   7.0
3     A      4  11.0
4     A      5   7.0
5     A      6   5.0
6     A      7   6.0
7     A      8   0.0
8     A      9   4.0
9     A     10   0.0
10    A     11   9.0
11    A     12   0.0

关于python - 有没有一种方法可以计算每个月列值从A到B花费的天数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58509369/

10-12 21:44