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没问题,我想要一些自学的指导,这个链接很有用。谢谢