我们在某些时期有一些现成的销售数据,例如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年之间进行插值)。 非常感谢。
答案 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;。