Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 操纵周数_Python_Python 3.x_Pandas_Python Datetime - Fatal编程技术网

Python 操纵周数

Python 操纵周数,python,python-3.x,pandas,python-datetime,Python,Python 3.x,Pandas,Python Datetime,我有日期数据,但我想在时间方面做得更多。我创建了一个函数,可以在我选择的时候操纵一周的开始,即0将是星期三而不是星期天。它还将每月标签添加到我的数据框中: def date_manipulate(df,startday): df['Month']=df.index.strftime("%B") df['DOW']=df.index.strftime("%A") week = {} default_week =['Sunday', 'Monday', 'Tuesda

我有日期数据,但我想在时间方面做得更多。我创建了一个函数,可以在我选择的时候操纵一周的开始,即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
当我编辑的时候,我有了一个火花

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

我创建了一个函数,可以在我选择的时候操纵一周的开始,即0是星期三而不是星期天

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

星期一=0,星期日=6的一周中的某一天

您可以测试事物是否正确排列:

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

正如上面的评论所提到的,我更关心的是对数据应用正确的周数。我能够用下面的代码解决它。逻辑如下。 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
offset=list(week.values())[df['DOW'][0]]
startdate=df['temp_date'][0]-(偏移量)
结束日期=开始日期+6
周=1
df[‘周’]=0
对于计数器,枚举中的日期(df['temp_date']):
#如果df.loc[柜台,'商户名称']==当前商户:
如果df['merchant\u name'][计数器]==当前商户:

如果(df['temp_date'][counter])您好,谢谢您优化我的代码。我更关心的是第二部分。如何正确地聚合一周,而不是默认的周日到周六场景?如果我的一周从周三开始,我如何将一周从周三改为周二,而不是从周日改为周六。谢谢抱歉,我不确定我是否只是根据你的代码在@Longroadahead跟踪你。如果你能添加一些示例输入/输出数据来表示你试图达到的目的,这会有所帮助。我刚刚编辑了这个问题,在编辑的过程中我也展示了我的思维过程。同时,我将尝试自己解决这个问题。再次感谢。
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