有没有办法在每30分钟或x分钟的所有日期对时间序列进行分组。我的问题与this非常相似。如果我想在约会中按小时分组,我只需要
data=pd.DataFrame({'Values': 1,'Date':pd.date_range('01-01-2017',periods=3600,freq='T')})
data.set_index(['Date'],inplace=True)
grouped=data.groupby(data.index.hour)
运行for循环并打印最后一组给我:
for time,group in grouped:
print(group)
Values
Date
2017-01-01 23:00:00 1
2017-01-01 23:01:00 1
2017-01-01 23:02:00 1
2017-01-01 23:03:00 1
2017-01-01 23:04:00 1
2017-01-01 23:05:00 1
2017-01-01 23:06:00 1
2017-01-01 23:07:00 1
2017-01-01 23:08:00 1
2017-01-01 23:09:00 1
2017-01-01 23:10:00 1
2017-01-01 23:11:00 1
2017-01-01 23:12:00 1
2017-01-01 23:13:00 1
2017-01-01 23:14:00 1
2017-01-01 23:15:00 1
2017-01-01 23:16:00 1
2017-01-01 23:17:00 1
2017-01-01 23:18:00 1
2017-01-01 23:19:00 1
2017-01-01 23:20:00 1
2017-01-01 23:21:00 1
2017-01-01 23:22:00 1
2017-01-01 23:23:00 1
2017-01-01 23:24:00 1
2017-01-01 23:25:00 1
2017-01-01 23:26:00 1
2017-01-01 23:27:00 1
2017-01-01 23:28:00 1
2017-01-01 23:29:00 1
...
2017-01-02 23:30:00 1
2017-01-02 23:31:00 1
2017-01-02 23:32:00 1
2017-01-02 23:33:00 1
2017-01-02 23:34:00 1
2017-01-02 23:35:00 1
2017-01-02 23:36:00 1
2017-01-02 23:37:00 1
2017-01-02 23:38:00 1
2017-01-02 23:39:00 1
2017-01-02 23:40:00 1
2017-01-02 23:41:00 1
2017-01-02 23:42:00 1
2017-01-02 23:43:00 1
2017-01-02 23:44:00 1
2017-01-02 23:45:00 1
2017-01-02 23:46:00 1
2017-01-02 23:47:00 1
2017-01-02 23:48:00 1
2017-01-02 23:49:00 1
2017-01-02 23:50:00 1
2017-01-02 23:51:00 1
2017-01-02 23:52:00 1
2017-01-02 23:53:00 1
2017-01-02 23:54:00 1
2017-01-02 23:55:00 1
2017-01-02 23:56:00 1
2017-01-02 23:57:00 1
2017-01-02 23:58:00 1
2017-01-02 23:59:00 1
但是没有times.30min
命令。
编辑:
我试图将所有日期的每30分钟分组一次。我希望输出完全像上面的命令,但是x分钟。默认grouped = df.groupby(pd.TimeGrouper('30T'))
不起作用,因为它会单独对日期进行分组。因此,如果我有2017-01-01和2017-01-02,pd.TimeGrouper('30T')
的分钟日期时间戳,请将0:00-0:30 2017-01-01
和0:00-0:30 2017-01-02
拆分为单独的组。我希望他们合并。
答案 0 :(得分:4)
使用pd.TimeGrouper
grouped = df.groupby(pd.TimeGrouper('30T'))
演示
tidx = pd.date_range('2017-03-01', periods=240, freq='T')
df = pd.DataFrame(np.random.randint(10, size=(len(tidx), 3)), tidx, list('ABC'))
df.groupby(pd.TimeGrouper('30T')).sum()
A B C
2017-03-01 00:00:00 134 115 145
2017-03-01 00:30:00 139 113 130
2017-03-01 01:00:00 159 123 147
2017-03-01 01:30:00 115 143 156
2017-03-01 02:00:00 144 145 134
2017-03-01 02:30:00 142 143 166
2017-03-01 03:00:00 152 154 130
2017-03-01 03:30:00 121 121 170
答案 1 :(得分:4)
好的,我想我想要这样做:
data=pd.DataFrame({'Values': 1,'Date':pd.date_range('01-01-2017',periods=3600,freq='T')})
data.set_index(['Date'],inplace=True)
g = data.groupby([data.index.hour, data.index.minute // 15])
#this will group the each day in 15-minute intervals for all dates.
for n,g in grouped:
print(g)
输出:
Values
Date
2017-01-01 00:00:00 1
2017-01-01 00:01:00 1
2017-01-01 00:02:00 1
2017-01-01 00:03:00 1
2017-01-01 00:04:00 1
2017-01-01 00:05:00 1
2017-01-01 00:06:00 1
2017-01-01 00:07:00 1
2017-01-01 00:08:00 1
2017-01-01 00:09:00 1
2017-01-01 00:10:00 1
2017-01-01 00:11:00 1
2017-01-01 00:12:00 1
2017-01-01 00:13:00 1
2017-01-01 00:14:00 1
2017-01-02 00:00:00 1
2017-01-02 00:01:00 1
2017-01-02 00:02:00 1
2017-01-02 00:03:00 1
2017-01-02 00:04:00 1
2017-01-02 00:05:00 1
2017-01-02 00:06:00 1
2017-01-02 00:07:00 1
2017-01-02 00:08:00 1
2017-01-02 00:09:00 1
2017-01-02 00:10:00 1
2017-01-02 00:11:00 1
2017-01-02 00:12:00 1
2017-01-02 00:13:00 1
2017-01-02 00:14:00 1
您可以使用pd.Grouper
或resample
。 (注意:pd.TimeGrouper
no advantages超过pd.Grouper
。)
pd.Grouper
:df = pd.DataFrame({'Values': 1,'Date':pd.date_range('01-01-2017',periods=3600,freq='T')})
df.groupby(pd.Grouper(freq='15T',key='Date')).sum()
输出:
Values
Date
2017-01-01 00:00:00 15
2017-01-01 00:15:00 15
2017-01-01 00:30:00 15
2017-01-01 00:45:00 15
2017-01-01 01:00:00 15
resample
:df.resample('15T', on='Date').sum()
输出:
Values
Date
2017-01-01 00:00:00 15
2017-01-01 00:15:00 15
2017-01-01 00:30:00 15
2017-01-01 00:45:00 15
2017-01-01 01:00:00 15
如果你的日期在索引中作为日期时间dtype,那么你有一个DatetimeIndex,你需要省略方法1和方法2中的key
和on
参数。