传播日期熊猫和插值

时间:2018-04-04 13:59:45

标签: python pandas interpolation

我们在某些时期有一些现成的销售数据,例如1周,1个月...... 1年:

time_pillars = pd.Series(['1W', '1M', '3M', '1Y'])
sales = pd.Series([4.75, 5.00, 5.10, 5.75])
data = {'time_pillar': time_pillars, 'sales': sales}
df = pd.DataFrame(data)

我想做两个操作。 首先,创建一个日期类型的新列df ['date'],它对应于从现在起1周,1个月...... 1年的实际日期。

然后,我想创建另一个列df ['days_from_now'],花费这些支柱多少天(1周是7天,1个月大约30天... 1年365天左右)。

这样做的目的是使用任何一天作为简单的linear_interpolation_method()的输入来获取任何给定日期的销售数据(例如,4Octobober2018的销售额是什么?--->我们将在3个月和1年之间进行插值)。 非常感谢。

1 个答案:

答案 0 :(得分:2)

我不完全确定您对插值的含义,但这是一种在pandas中制作数据框的方法(从您在帖子中提供的原始df开始):

from datetime import datetime
from dateutil.relativedelta import relativedelta

def create_dates(df):
    df['date'] = [i.date() for i in 
                   [d+delt for d,delt in zip([datetime.now()] * 4 , 
                   [relativedelta(weeks=1), relativedelta(months=1), 
                       relativedelta(months=3), relativedelta(years=1)])]]
    df['days_from_now'] = df['date'] - datetime.now().date()
    return df

create_dates(df)

   sales time_pillar        date days_from_now
0   4.75          1W  2018-04-11        7 days
1   5.00          1M  2018-05-04       30 days
2   5.10          3M  2018-07-04       91 days
3   5.75          1Y  2019-04-04      365 days

我把它包装在一个函数中,这样你就可以在任何一天调用它,并在那一天获得你的结果1周,3周等。

注意:如果您希望days_from_now只是天数的整数,请在函数中使用df['days_from_now'] = [i.days for i in df['date'] - datetime.now().date()],而不是df['days_from_now'] = df['date'] - datetime.now().date()

<强>解释

df['date'] = [i.date() for i in 
               [d+delt for d,delt in zip([datetime.now()] * 4 , 
               [relativedelta(weeks=1), relativedelta(months=1), 
                   relativedelta(months=3), relativedelta(years=1)])]]

将今天的日期列表(datetime.now())重复4次,并分别添加1周,1个月,3个月和1年的relativedelta(时差),提取日期(i.date() for ...),最后使用结果列表创建一个新列。

df['days_from_now'] = df['date'] - datetime.now().date()

更加直截了当,它只是从今天的日期中减去你上面提到的那些新日期。结果是timedelta对象,pandas方便地格式化为&#34; n days&#34;。