首页 > 解决方案 > 在日期时间段内分配累积的第 N 天。[即这一行属于第134天]

问题描述

假设我有一个示例系列如下:

     TimeStamp
0    1/1/2019
1    1/1/2019
.       .
.       .
.       .
500 31/1/2019
501  1/2/2019
502  2/2/2019
503  2/2/2019

我将如何实现以下目标:

     TimeStamp   Nth Day
0    1/1/2019      1
1    1/1/2019      1
.       .          .
.       .          .
.       .          .
500 31/1/2019     31
501  1/2/2019     32
502  2/2/2019     33
503  2/2/2019     33

我们不仅要找出两个时间戳之间经过的天数,还要将第 N 天分配给相关行。

我写了一个 For 循环来检查 TimeStamp.dt.day 上是否有这样的开关:上次迭代超过 31 次,而这次超过 1 次 [从 1 月 31 日到 2 月 1 日],所以这意味着这是一个新的一天。如果是新的一天,则将 +1nth 天附加到由于此循环而创建的新系列。

它有效,但是,我有 50 万个条目,这需要很长时间(15-20 分钟)。有没有一种有效的方法来做到这一点?

编辑:循环。原谅冗长的旧/新变量。

daySeries = df['TimeStamp'].dt.day

dayList = pd.Series([1])

for eachday in daySeries:

    new = eachday   

    if len(dayList) == 1:        
        old = new

    lastVal = dayList[-1:].values[0]

    if new == old:
        dayList = dayList.append(pd.Series([lastVal]), ignore_index=True)
    else:
        dayList= dayList.append(pd.Series([lastVal+1]), ignore_index=True)    
    old = eachday    

df['Nth Day'] = dayList

标签: pythonpandas

解决方案


假设您的 Series 被调用df,您可以使用以下方法:

df = pd.DataFrame(df)
df['Nth day'] = 0
df.loc[df['TimeStamp'] != df['TimeStamp'].shift(),'Nth day'] = 1
df['Nth day'] = df['Nth day'].cumsum()
print(df)

在这里,您可以使用shiftloc来获取带有“新值指示符”的列(如果值是新的,则为 1,如果不是,则为 0)。然后您可以使用cumsum获得该指标的累积总和。


推荐阅读