Python 指定日期时间段内的累计第n天。[即,该行属于第134天]

Python 指定日期时间段内的累计第n天。[即,该行属于第134天],python,pandas,Python,Pandas,假设我有一个示例系列,如下所示: 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 . . . .

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

     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

假设您的序列名为
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)

在这里,您可以使用和来获取带有“新值指示器”的列(如果值是新的,则为1,如果值不是新的,则为0)。然后,您可以使用。

签出
pd。factorize
您可以发布for循环吗code@ksooklall请勾选编辑后的问题“第n天”列中您希望得到什么?是从第一个日期算起的天数,还是时间戳列中不同日期的订单号?例如,如果时间戳中的第一个值为2019年1月1日、2019年3月1日、2019年7月1日,“第n天”的值应该是什么?1,2,3还是1,3,7?@Stepan我现在明白了,我应该更清楚地选择从1月1日开始的示例。考虑到任何时间段,我希望从1开始,即如你所说的1,2,3天。太棒了!现在快到了。顺便说一句,for循环与此方法相比,有什么效率如此之低?与阵列操作的效率有关吗?[请原谅,我是编程初学者]。我恐怕无法提供任何细节,但我知道pandas针对阵列操作和..循环元素进行了优化。在pandas中,循环元素是处理阵列最低效的方法。你可以这样读:@Stephan没问题,我想要一些自学的指导,这个链接很有用。谢谢