首页 文章

操纵星期几编号

提问于
浏览
-1

我有日期数据,但我想在时间方面做得更多 . 我创建了一个函数,可以在我选择时操纵周开始,即0表示周三而不是周日 . 它还将月度标签添加到我的数据框中:

def date_manipulate(df,startday):
    df['Month']=df.index.strftime("%B")
    df['DOW']=df.index.strftime("%A")
    week = {}
    default_week =['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
    temp_week = default_week[startday:] + default_week[0:startday]
    for index, day in enumerate(temp_week):
        week[day] = index
    df.replace({"DOW":week},inplace=True)
    return df

然后我使用groupby汇总它们的年份和星期 .

def data_agg(df,name):
    df_monthly=df.groupby([(df['name']),(df.index.year),(df['Month']),(df.index.week),(df['DOW']),(df.index)],sort=True)
    df_monthly=cal_columns(df_monthly)
    df_monthly.index.names=['Name','Year','Month','Week','Day of Week','date']
    df_monthly.to_csv('data/{}_Aggregate.csv'.format(name))

这是好的,除了一周不考虑周三到周二现在是7天周而不是周日到周六 . 我想解决这个问题会从0到6进行7天的循环 . 但这会产生一个不同的问题,如果数据没有经过整周,即只有周三,周四,周五和下周三数据丢失,然后在本周结束或下周开始时没有明确的标识符 . 我觉得我现在处于逻辑沉降中 . 真的需要一些亮点,谢谢 .

所以我试图得到的一个例子就是这个

Week  day of the week  randdata
1         Wednesday       1
1         Thursday        3
1         Friday          4 
2         Wednesday       1 
2         Saturday        5
2         Sunday          6
3         Thursday        6
3         Friday          7

在我编辑时,我只是有一个火花 .

从星期三开始,根据日期开始计算连续天数,然后如果日期之间有差距,则开始新的一周,否则下一个星期三是新周的开始 .

2 回答

  • 0

    我创建了一个函数,可以在我选择时操纵周开始,即0表示周三而不是周日 .

    您可以使用 DatetimeIndex.dayofweek (或 Series.dt.dayofweek )更有效地执行此操作,在调用此属性之前应用偏移量:

    星期一= 0,星期日= 6的星期几

    >>> import pandas as pd
    
    >>> days = ['Monday', 'Tuesday', 'Wednesday',
                'Thursday', 'Friday', 'Saturday', 'Sunday']
    
    >>> def custom_dayofweek(ser, startday='Monday'):
           # Use enumerate/reversed dict if you really want
           #     to optimize speed
           offset = days.index(startday)
           if isinstance(ser, pd.Series):
               # otherwise: assume DatetimeIndex
               ser = ser.dt
           return (ser - offset).dayofweek
    
    >>> rng = pd.date_range('1/1/2011', periods=72)
    
    >>> custom_dayofweek(rng, startday='Sunday')
    Int64Index([6, 0, 1, 2, 3, 4, 5, 6, 0, 1,
                ...
                5, 6, 0, 1, 2, 3, 4, 5, 6, 0],
               dtype='int64', length=72)
    

    你可以测试一下这些东西是否正确排列:

    >>> rng.weekday_name
    Index(['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
           'Friday', 'Saturday', 'Sunday', 'Monday',
           ...
           'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday',
           'Thursday', 'Friday', 'Saturday', 'Sunday'],
          dtype='object', length=72)
    
    >>> custom_dayofweek(rng, 'Wednesday')
    Int64Index([3, 4, 5, 6, 0, 1, 2, 3, 4, 5,
                ...
                2, 3, 4, 5, 6, 0, 1, 2, 3, 4],
               dtype='int64', length=72)
    
  • 0

    正如上面的评论中所提到的,我更关心的是将正确的周数应用于数据 . 我能够使用以下代码解决它 . 逻辑如下 . 1)首先将日期索引转换为序数2)使用序数来计算一周的开始和结束日期,知道7天总是固定的 . 3)将周数分配给数据

    offset=list(week.values())[df['DOW'][0]]
    startdate=df['temp_date'][0]-(offset)
    enddate=startdate+6
    week=1
    df['week']=0
    for counter, day in enumerate (df['temp_date']):
        #if df.loc[counter, 'merchant_name']==current_merchant:
        if df['merchant_name'][counter]==current_merchant:
            if(df['temp_date'][counter])<=enddate:
                df['week'][counter]=week
            else:
                enddate+=7
                week+=1
                df['week'][counter]=week
        else:
            current_merchant=df['merchant_name'][counter]
            startdate=df['temp_date'][counter]-(offset)
            enddate=startdate+6
            week=1
            df['week'][counter]=week
    

相关问题