Python 基于另一列重新启动倒计时

Python 基于另一列重新启动倒计时,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,其中包含一个名为“倒计时”的变量,该变量对数据框中的天数进行倒计时,即使某些天数有多个条目(行) 我希望倒计时变量在特定日期后“重新启动”。所以我想从2008-01-01倒计时到2008-01-03,然后从2008-01-03倒计时到2008-01-06,等等 期望输出: full dates Countdown 0 2008-01-01 2 1 2008-01-02 1 2 2008-01-03

我有一个数据框,其中包含一个名为“倒计时”的变量,该变量对数据框中的天数进行倒计时,即使某些天数有多个条目(行)

我希望倒计时变量在特定日期后“重新启动”。所以我想从2008-01-01倒计时到2008-01-03,然后从2008-01-03倒计时到2008-01-06,等等

期望输出:

       full dates  Countdown  
0      2008-01-01       2
1      2008-01-02       1 
2      2008-01-03       0  
3      2008-01-04       2  
4      2008-01-05       1  
5      2008-01-06       0

我的数据帧要大得多,但想法是一样的:在给定的两天之间,我想开始倒计时,然后在另一天“重新启动”(在本例中,它在2008-01-03和2008-01-06“重新启动”。

您可以使用
pd执行此操作。合并\u asof
。创建右侧箱子边缘的
数据框,然后合并最近的边缘,并计算截止日期的天数

import pandas as pd

# Right bin edges for your countdowns. 
dates = ['2008-01-03', '2008-01-06']
df_dates = pd.DataFrame({'date': pd.to_datetime(dates)})

# Convert original DataFrame to datetime
df['full dates'] = pd.to_datetime(df['full dates'])

# Merge and calculate the Countdown value
df = pd.merge_asof(df, df_dates, left_on ='full dates', right_on ='date', direction='forward') 

df['Countdown'] = (df['date']-df['full dates']).dt.days
df = df.drop(columns='date')  # No longer needed
输出:
df

我编辑了这个问题,感谢有多个条目的天数,计数器应该增加还是保持不变?基本上,计数器实际上是基于相隔天数,还是仅仅基于行数?它是基于天数,而不是行数。谢谢!但是我在这一行中得到一个错误'df=pd.merge_asof(df,df_dates,left_on='full dates',right_on='date',direction='forward')类型错误:merge_asof()得到一个意外的关键字参数'direction'@gramstreich什么版本的熊猫?因为
默认值是“backward”并且在0.20.0以下的版本中兼容。在0.20.0版本中添加了方向参数,并引入了“向前”和“最近的”。
ahh,我在python 3中
import pandas as pd

# Right bin edges for your countdowns. 
dates = ['2008-01-03', '2008-01-06']
df_dates = pd.DataFrame({'date': pd.to_datetime(dates)})

# Convert original DataFrame to datetime
df['full dates'] = pd.to_datetime(df['full dates'])

# Merge and calculate the Countdown value
df = pd.merge_asof(df, df_dates, left_on ='full dates', right_on ='date', direction='forward') 

df['Countdown'] = (df['date']-df['full dates']).dt.days
df = df.drop(columns='date')  # No longer needed
  full dates  Countdown
0 2008-01-01          2
1 2008-01-02          1
2 2008-01-03          0
3 2008-01-04          2
4 2008-01-05          1
5 2008-01-06          0