Python 如何将每月数据拆分为每周数据并保留现有数据?

Python 如何将每月数据拆分为每周数据并保留现有数据?,python,pandas,time-series,Python,Pandas,Time Series,我希望将每月数据拆分为每周数据,并使用每周所指的相同每月值填充每周行 这些变量是我需要处理的。 “开始日期”非空datetime64[ns] “结束日期”非空datetime64[ns] import pandas as pd df = pd.read_excel("file") import pandas as pd import math, datetime d1 = datetime.date(yyyy, mm, dd) d2 = datetime.date(yyyy, mm, dd)

我希望将每月数据拆分为每周数据,并使用每周所指的相同每月值填充每周行

这些变量是我需要处理的。 “开始日期”非空datetime64[ns] “结束日期”非空datetime64[ns]

import pandas as pd
df = pd.read_excel("file")
import pandas as pd
import math, datetime
d1 = datetime.date(yyyy, mm, dd)

d2 = datetime.date(yyyy, mm, dd)
h = []
while d1 <= d2: 
    print(d1) 
    d1 = d1 + datetime.timedelta(days=7) 

    h.append(d1)

df = pd.Series(h)
print(df)
这就是我想要的:

weekly date       price    model
 2013-01-01        1000    blue
 2013-01-01        598     blue
 2013-01-08        1000    blue
 2013-01-08        598     blue
 2013-01-15        156     red
 2013-01-22        156     red
如下所示:

转换为
pd.to\u datetime()

开始时间
列创建字典:

使用
pd.date\u range()

结束时间相同:

根据开始时间和
ffill()
映射
data
列,直到下一个
start time
到达:


我将假设数据集中的
开始日期
结束日期
从不重叠。我还要假设你的例子是正确的,因为它与你的话相矛盾。这不是月度数据,而是双月数据。此代码应在任何频率下工作

 # creates some sample data
 df = pd.DataFrame(data={'starting date':pd.to_datetime(['2019-01-01','2019-01-15','2019-02-01','2019-02-15']),
                                 'data':[1,2,3,4]})

 # Hold the stant and end dates of the new df
 d1 = pd.datetime(2019,1,1)
 d2 = pd.datetime(2019,2,28)

 # Create a new DF to hold results
 new_df = pd.DataFrame({'date':pd.DatetimeIndex(start=d1,end=d2,freq='w')})

 # Merge based on the closest start date.
 result = pd.merge_asof(new_df,df,left_on='date',right_on='starting date')

你的话和你的例子不一样。您有要转换为每周数据的月度数据或双月数据吗?此外,我们不知道您的边缘情况可能是什么。原始数据中是否存在开始日期和结束日期可能重叠的情况?如果数据如图所示为每两周一次,请参考以下答案事实上数据不是每两周一次。我想合并开始日期和结束日期之间的间隔,并每周获取一次。Polkaguy6000。您有要转换为每周数据的月度数据或双月数据吗?是的,这就是我想要的。但我有500个观察结果和15个专栏。例如,从2013-01-01到2013-01-14有两个星期。好吧,我希望每周有一个新列,其中两行的值相同,因为从2013-01-01到2013-01-07和2013-01-08到2013-01-14都有相同的值。@miguelmedina那么14列是日期,1列是数据?我的答案对你有用吗?关于这个方法的问题。不确定性能是否是一个因素,但为了我将来的参考,在这个上下文中,
map
是矢量化的。我的答案是使用合并。不确定哪一个会更快,而且我没有足够大的数据集来测试它。是的,因为map是一个熊猫方法,它是矢量化的,应该足够快。这还假设
start date
是日期时间,如果不是,则必须使用
pd.to_datetime()
将其转换为另一个答案所建议的日期时间。
df[['starting date','ending date']] = df[['starting date','ending date']].apply(pd.to_datetime)
d=dict(zip(df['starting date'],df.data))
#{Timestamp('2013-01-01 00:00:00'): 20, Timestamp('2013-01-15 00:00:00'): 21}
df_new = pd.DataFrame(pd.date_range(df['starting date'].iloc[0],df['ending date'].iloc[-1],freq='W-TUE'),columns=['StartDate'])
df_new['EndDate']=pd.date_range(df['starting date'].iloc[0],df['ending date'].iloc[-1],freq='W-MON')
df_new['data']=df_new.StartDate.map(d).ffill()
print(df_new)

   StartDate    EndDate  data
0 2013-01-01 2013-01-07  20.0
1 2013-01-08 2013-01-14  20.0
2 2013-01-15 2013-01-21  21.0
3 2013-01-22 2013-01-28  21.0
 # creates some sample data
 df = pd.DataFrame(data={'starting date':pd.to_datetime(['2019-01-01','2019-01-15','2019-02-01','2019-02-15']),
                                 'data':[1,2,3,4]})

 # Hold the stant and end dates of the new df
 d1 = pd.datetime(2019,1,1)
 d2 = pd.datetime(2019,2,28)

 # Create a new DF to hold results
 new_df = pd.DataFrame({'date':pd.DatetimeIndex(start=d1,end=d2,freq='w')})

 # Merge based on the closest start date.
 result = pd.merge_asof(new_df,df,left_on='date',right_on='starting date')