我有日期数据,但我想在时间方面做得更多 . 我创建了一个函数,可以在我选择时操纵周开始,即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 回答
您可以使用
DatetimeIndex.dayofweek
(或Series.dt.dayofweek
)更有效地执行此操作,在调用此属性之前应用偏移量:你可以测试一下这些东西是否正确排列:
正如上面的评论中所提到的,我更关心的是将正确的周数应用于数据 . 我能够使用以下代码解决它 . 逻辑如下 . 1)首先将日期索引转换为序数2)使用序数来计算一周的开始和结束日期,知道7天总是固定的 . 3)将周数分配给数据