分组熊猫数据帧由n天开始当天的开头
我刚刚发现熊猫的动力,我喜欢它,但我无法弄清楚这个问题:分组熊猫数据帧由n天开始当天的开头
我有一个数据帧df.head()
:
lon lat h filename time
0 19.961216 80.617627 -0.077165 60048 2002-05-15 12:59:31.717467
1 19.923916 80.614847 -0.018689 60048 2002-05-15 12:59:31.831467
2 19.849396 80.609257 -0.089205 60048 2002-05-15 12:59:32.059467
3 19.830776 80.607857 0.076485 60048 2002-05-15 12:59:32.116467
4 19.570708 80.588183 0.162943 60048 2002-05-15 12:59:32.888467
我想我的组数据为九个天的间隔
gb = df.groupby(pd.TimeGrouper(key='time', freq='9D'))
第一组:
2002-05-15 12:59:31.717467 lon lat h filename time
0 19.961216 80.617627 -0.077165 60048 2002-05-15 12:59:31.717467
1 19.923916 80.614847 -0.018689 60048 2002-05-15 12:59:31.831467
2 19.849396 80.609257 -0.089205 60048 2002-05-15 12:59:32.059467
3 19.830776 80.607857 0.076485 60048 2002-05-15 12:59:32.116467
...
下一组:(:59:31.717467 12)从一天的开始,而不是因为我想
2002-05-24 12:59:31.717467 lon lat height filename time
815 18.309498 80.457024 0.187387 60309 2002-05-24 16:35:39.553563
816 18.291458 80.458514 0.061446 60309 2002-05-24 16:35:39.610563
817 18.273408 80.460014 0.129255 60309 2002-05-24 16:35:39.667563
818 18.255358 80.461504 0.046761 60309 2002-05-24 16:35:39.724563
...
所以数据九天从第一计时分组。
当以一天分组:
gb = df.groupby(pd.TimeGrouper(key='time', freq='D'))
给我:
2002-05-15 00:00:00 lon lat h filename time
0 19.961216 80.617627 -0.077165 60048 2002-05-15 12:59:31.717467
1 19.923916 80.614847 -0.018689 60048 2002-05-15 12:59:31.831467
2 19.849396 80.609257 -0.089205 60048 2002-05-15 12:59:32.059467
3 19.830776 80.607857 0.076485 60048 2002-05-15 12:59:32.116467
...
我就可以在几天循环,直到我得到一个九天的间隔,但我认为它可以做更聪明,我正在寻找相当于YS(年初)的Grouper freq
选项,只需几天,设置开始时间的一种方法(可能通过Grouper选项convention : {‘start’, ‘end’, ‘e’, ‘s’}
),或者?
我运行的Python 3.5.2和熊猫是在版本:0.19.0
第一次滴行:
最好的办法将是normalize
的datetime
列的第一行根据9D间隔,使得时间被重置00:00:00
(午夜)和组:
df.loc[0, 'time'] = df['time'].iloc[0].normalize()
for _, grp in df.groupby(pd.TimeGrouper(key='time', freq='9D')):
print (grp)
# lon lat h filename time
# 0 19.961216 80.617627 -0.077165 60048 2002-05-15 00:00:00.000000
# 1 19.923916 80.614847 -0.018689 60048 2002-05-15 12:59:31.831467
# 2 19.849396 80.609257 -0.089205 60048 2002-05-15 12:59:32.059467
# 3 19.830776 80.607857 0.076485 60048 2002-05-15 12:59:32.116467
# 4 19.570708 80.588183 0.162943 60048 2002-05-15 12:59:32.888467
# ......................................................................
这会在其他行中恢复时间,因此您不会丢失该信息。
保持第一次行:
如果你想保持在第一时间行,因为它是不作任何修改,但只是想开始从午夜分组起,你可以这样做:
df_t_shift = df.shift() # Shift one level down
df_t_shift.loc[0, 'time'] = df_t_shift['time'].iloc[1].normalize()
# Concat last row of df with the shifted one to account for the loss of row
df_t_shift = df_t_shift.append(df.iloc[-1], ignore_index=True)
for _, grp in df_t_shift.groupby(pd.TimeGrouper(key='time', freq='9D')):
print (grp)
# lon lat h filename time
# 0 NaN NaN NaN NaN 2002-05-15 00:00:00.000000
# 1 19.961216 80.617627 -0.077165 60048.0 2002-05-15 12:59:31.717467
# 2 19.923916 80.614847 -0.018689 60048.0 2002-05-15 12:59:31.831467
# 3 19.849396 80.609257 -0.089205 60048.0 2002-05-15 12:59:32.059467
# 4 19.830776 80.607857 0.076485 60048.0 2002-05-15 12:59:32.116467
# 5 19.570708 80.588183 0.162943 60048.0 2002-05-15 12:59:32.888467
感谢您的回答 – user1643523
如果截断日期时间给定的一天午夜,如预期的分组就可以了(开始在一天的开始)。我预期通过转换为日期时间的工作,e.g
df['date'] = df['time'].apply(lambda x:x.date())
但是,您不能使用TimeGrouper
除非索引是一个datetime
。 你不是有两个选择,要么直接截断日期时间至午夜如下:
df['date'] = df['time'].apply(lambda x:x.replace(hour=0, minute=0, second=0, microsecond=0)))
或者,您可以先产生date
值,然后将其转换回日期时间,使用pd.to_datetime()
功能:
df['date'] = df['time'].apply(lambda x: x.date())
df['date'] = pd.to_datetime(df['date'])
感谢您的回答 – user1643523
完成@mfitzp回答你可以这样做:
df['dateonly'] = df['time'].apply(lambda x: x.date())
只与问题是df['dateonly']
不会是一个DatetimeIndex
你需要先将其转换:
df['dateonly'] = pd.to_datetime(df['dateonly'])
现在你可以在它
gb = df.groupby(pd.TimeGrouper(key='dateonly', freq='9D'))
和额外的信息convention
组用于与PeriodIndex
不DatetimeIndex
感谢您的回答 – user1643523
[这个答案](http://stackoverflow.com/a/22528074/754456)建议添加参数'闭合='left''可能做到这一点? – mfitzp
我试过了,但没有改变什么 – user1643523
'convention ='s''做了什么吗?文档严重缺乏'TimeGrouper'的参数。 – mfitzp