Python 熊猫重采样上采样最后日期/数据边缘
我试图将每周数据的采样增加到每日数据,但是,我很难对最后一条边进行采样。我该怎么办Python 熊猫重采样上采样最后日期/数据边缘,python,python-3.x,pandas,datetime,reindex,Python,Python 3.x,Pandas,Datetime,Reindex,我试图将每周数据的采样增加到每日数据,但是,我很难对最后一条边进行采样。我该怎么办 import pandas as pd import datetime df = pd.DataFrame({'wk start': ['2018-08-12', '2018-08-12', '2018-08-19'], 'car': [ 'tesla model 3', 'tesla model x', 'tesla model 3'], 'sales':[38000,98000, 40000
import pandas as pd
import datetime
df = pd.DataFrame({'wk start': ['2018-08-12', '2018-08-12', '2018-08-19'],
'car': [ 'tesla model 3', 'tesla model x', 'tesla model 3'],
'sales':[38000,98000, 40000]})
df['wk start'] = df['wk start'].apply(lambda x: datetime.datetime.strptime(x, '%Y-%m-%d'))
df.set_index('wk start').groupby('car').resample('D').pad()
这将返回:
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
我期望的输出是:
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
2018-08-20 tesla model 3 40000
2018-08-21 tesla model 3 40000
2018-08-22 tesla model 3 40000
2018-08-23 tesla model 3 40000
2018-08-24 tesla model 3 40000
2018-08-25 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
2018-08-13 tesla model x 98000
2018-08-14 tesla model x 98000
2018-08-15 tesla model x 98000
2018-08-16 tesla model x 98000
2018-08-17 tesla model x 98000
2018-08-18 tesla model x 98000
我看了,但他们用句号,我看的是日期时间。提前谢谢 在使用之前的
groupby
尝试之前,为每个周末和stack
指定一列:
(df.assign(end=df['wk start'].add(pd.DateOffset(6))).set_index(
['car', 'sales']).stack()
.rename('wk start').reset_index([0, 1])
.set_index('wk start').groupby('car')
.resample('D').pad()
)
输出:
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
2018-08-20 tesla model 3 40000
2018-08-21 tesla model 3 40000
2018-08-22 tesla model 3 40000
2018-08-23 tesla model 3 40000
2018-08-24 tesla model 3 40000
2018-08-25 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
2018-08-13 tesla model x 98000
2018-08-14 tesla model x 98000
2018-08-15 tesla model x 98000
2018-08-16 tesla model x 98000
2018-08-17 tesla model x 98000
2018-08-18 tesla model x 98000
是的,您是对的,排除了最后一条边数据。解决方案是将它们添加到输入
DataFrame
-我的解决方案在使用您的解决方案之前,使用创建一个助手DataFrame
,将6
天和天添加到原始df
:
df1 = df.sort_values('wk start').drop_duplicates('car', keep='last').copy()
df1['wk start'] = df1['wk start'] + pd.Timedelta(6, unit='d')
df = pd.concat([df, df1], ignore_index=True)
df = df.set_index('wk start').groupby('car').resample('D').pad()
print (df)
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
2018-08-20 tesla model 3 40000
2018-08-21 tesla model 3 40000
2018-08-22 tesla model 3 40000
2018-08-23 tesla model 3 40000
2018-08-24 tesla model 3 40000
2018-08-25 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
2018-08-13 tesla model x 98000
2018-08-14 tesla model x 98000
2018-08-15 tesla model x 98000
2018-08-16 tesla model x 98000
2018-08-17 tesla model x 98000
2018-08-18 tesla model x 98000
你也可以这样做:
(pd.melt(df.assign(w = df['wk start']+pd.DateOffset(6)),df.columns[1:],value_name =
"wk start").drop('variable',1).set_index('wk start').groupby('car').resample('D').pad())
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
2018-08-20 tesla model 3 40000
2018-08-21 tesla model 3 40000
2018-08-22 tesla model 3 40000
2018-08-23 tesla model 3 40000
2018-08-24 tesla model 3 40000
2018-08-25 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
2018-08-13 tesla model x 98000
2018-08-14 tesla model x 98000
2018-08-15 tesla model x 98000
2018-08-16 tesla model x 98000
2018-08-17 tesla model x 98000
2018-08-18 tesla model x 98000
根据给定的值,不可能生成一个工作开始input@Yuca为什么不可能?日期限定在2018-08-12和2018-08-19之间,为什么您希望您的输出数据的日期在2018-08-20之后?@Yuca我认为,无论它为8/12做什么,它也可以为8/19做什么。我想我可能需要重新编制索引,而不是重新取样,这不是我要说的。检查您想要的输出,您的日期超出了输入的范围。您需要一些东西来生成2018-08-19Ah之后的未来日期。这非常有效!非常感谢。尽管我必须为其他人指出,这些值必须是wk值,必须在删除重复项之前对其进行排序。再次感谢@jezrael@MariahAkinbi-不客气!如果我的答案有帮助,别忘了——点击答案旁边的复选标记,将其从灰色变为填充。谢谢。(和其他人)我接受了这个答案,因为1)它比单行回答快0.5秒,2)调试更容易-再次感谢!谢谢你的回复!这适用于给定的数据集,但在我的实际数据集(包含更多列)上调试有点棘手,并且比公认的答案慢一点。不过,我真的很欣赏这一行@user3483203one甚至可以使用append。。有几个选择,我相信没有考虑融化,很好的答案!