我刚刚发现了熊猫的力量而我喜欢它,但我无法弄清楚这个问题:
我有一个DataFrame 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
Run Code Online (Sandbox Code Playgroud)
我想将我的数据分组为九天
gb = df.groupby(pd.TimeGrouper(key='time', freq='9D'))
Run Code Online (Sandbox Code Playgroud)
第一组:
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
...
Run Code Online (Sandbox Code Playgroud)
下一组:
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
...
Run Code Online (Sandbox Code Playgroud)
因此,数据从第一次(12:59:31.717467)开始计算,分为9天,而不是按照我的意愿从一天开始.
分组一天时:
gb = df.groupby(pd.TimeGrouper(key='time', freq='D'))
Run Code Online (Sandbox Code Playgroud)
给我:
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
...
Run Code Online (Sandbox Code Playgroud)
我可以循环过去,直到我得到一个九天的间隔,但我认为它可以更聪明地完成,我正在寻找一个freq相当于YS(年初)的Grouper 选项只是几天,一种设定开始时间的方法(也许是通过Grouper选项convention : {‘start’, ‘end’, ‘e’, ‘s’}),或???
我正在运行Python 3.5.2并且Pandas的版本是:0.19.0
删除第一个时间行:
您最好的选择是normalize该列的第一行datetime,以便时间重置为00:00:00(午夜)并根据9D间隔进行分组:
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
# ......................................................................
Run Code Online (Sandbox Code Playgroud)
这会恢复其他行中的时间,因此您不会丢失该信息。
保留第一行:
如果您想保留第一个时间行而不对其进行任何更改,但只想从午夜开始分组,您可以这样做:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1856 次 |
| 最近记录: |