传播日期 pandas 并进行插值
Propagate dates pandas and interpolate
我们有一些现成的特定时期的销售数据,例如 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 年之间插入)。
非常感谢。
我不太确定你的插值是什么意思,但这里有一种在 pandas
中制作数据框的方法(从你在 [=37] 中提供的原始 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次的列表,加上relativedelta
(时差)1周、1个月、3个月、1年,分别提取日期 (i.date() for ...
),最后使用结果列表创建一个新列。
df['days_from_now'] = df['date'] - datetime.now().date()
要简单得多,它只是从今天的日期中减去上面得到的那些新日期。结果是一个 timedelta 对象,pandas
方便地将其格式化为“n days
”。
我们有一些现成的特定时期的销售数据,例如 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 年之间插入)。 非常感谢。
我不太确定你的插值是什么意思,但这里有一种在 pandas
中制作数据框的方法(从你在 [=37] 中提供的原始 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次的列表,加上relativedelta
(时差)1周、1个月、3个月、1年,分别提取日期 (i.date() for ...
),最后使用结果列表创建一个新列。
df['days_from_now'] = df['date'] - datetime.now().date()
要简单得多,它只是从今天的日期中减去上面得到的那些新日期。结果是一个 timedelta 对象,pandas
方便地将其格式化为“n days
”。