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

时间:2019-01-24 15:47:22

标签: 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)
h = []
while d1 <= d2: 
    print(d1) 
    d1 = d1 + datetime.timedelta(days=7) 

    h.append(d1)

df = pd.Series(h)
print(df)

我已经尝试了上面的代码,但是 我认为这完全没用:

这就是我的数据集中的内容:

price    starting date  ending date   model
 1000     2013-01-01  2013-01-14       blue
 598      2013-01-01  2013-01-14       blue
 156      2013-01-15  2013-01-28       red

这就是我想要得到的:

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

2 个答案:

答案 0 :(得分:1)

如下所示:

转换为pd.to_datetime()

df[['starting date','ending date']] = df[['starting date','ending date']].apply(pd.to_datetime)

start time列创建字典:

d=dict(zip(df['starting date'],df.data))
#{Timestamp('2013-01-01 00:00:00'): 20, Timestamp('2013-01-15 00:00:00'): 21}

使用pd.date_range()创建一个具有每周开始时间间隔的数据框:

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')

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

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

答案 1 :(得分:0)

我将假设starting dateending date在您的数据集中永不重叠。我还将假设您的示例是正确的,因为它与您的语言相矛盾。它不是每月数据,而是每两个月一次的数据。该代码应能在任何频率下工作。

 # 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')