基于唯一时间的迭代子集数据框架

时间:2017-06-08 03:25:08

标签: python pandas

给出以下示例DataFrame:

>>> df
                 Times  Values
0  05/10/2017 01:01:03       1
1  05/10/2017 01:05:00       2
2  05/10/2017 01:06:10       3
3  05/11/2017 08:25:20       4
4  05/11/2017 08:30:14       5
5  05/11/2017 08:30:35       6

我希望通过“时间”列对此DataFrame进行子集化,方法是将部分字符串与小时匹配。例如,我想使用包含“05/10/2017 01:”和“05/11/2017 08:”的部分字符串进行子集,该字符串将子集分成两个新的数据框:

>>> df1
                 Times  Values
0  05/10/2017 01:01:03       1
1  05/10/2017 01:05:00       2
2  05/10/2017 01:06:10       3

>>> df2
0  05/11/2017 08:25:20       4
1  05/11/2017 08:30:14       5
2  05/11/2017 08:30:35       6

是否有可能在Pandas中对此子集进行迭代,对于同样具有日期/小时作为公共标识符的多个日期/时间?

5 个答案:

答案 0 :(得分:2)

首先,将您的Times列转换为日期时间格式,并将其设置为索引:

df['Times'] = pd.to_datetime(df['Times'])
df.set_index('Times', inplace = True)

然后使用groupby方法,TimeGrouper

g = df.groupby(pd.TimeGrouper('h'))

g是一个迭代器,它产生元组对和那些时间的子数据帧。如果你只想要sub-dfs,你可以zip(*g)[1]

警告:子dfs由时间戳索引,pd.TimeGrouper仅在时间为索引时才有效。如果您希望将时间戳作为列,则可以执行以下操作:

df['Times'] = pd.to_datetime(df['Times'])
df['time_hour'] = df['Times'].dt.floor('1h')
g = df.groupby('time_hour')

或者,您可以从前一种方法调用每个dfs上的.reset_index(),但这可能要慢得多。

答案 1 :(得分:1)

将时间转换为小时,groupby,然后将每个组提取为DF。

df1,df2=[g.drop('hour',1) for n,g in\
         df.assign(hour=pd.DatetimeIndex(df.Times)\
           .to_period('h')).groupby('hour')]

df1
Out[874]: 
                Times  Values
0 2017-05-10 01:01:03       1
1 2017-05-10 01:05:00       2
2 2017-05-10 01:06:10       3

df2
Out[875]: 
                Times  Values
3 2017-05-11 08:25:20       4
4 2017-05-11 08:30:14       5
5 2017-05-11 08:30:35       6

答案 2 :(得分:0)

首先确保Times列的类型为DateTime。 其次,将times列设置为索引。 第三,使用between_time方法。

df['Times'] = pd.to_datetime(df['Times'])
df.set_index('Times', inplace=True)

df1 = df.between_time('1:00:00', '1:59:59')
df2 = df.between_time('8:00:00', '8:59:59')

答案 3 :(得分:0)

如果您使用datetime类型,则可以提取小时和天数等内容。

times = pd.to_datetime(df['Times'])
hours = times.apply(lambda x: x.hour)
df1 = df[hours == 1]

答案 4 :(得分:0)

您可以使用str[]访问者截断日期的字符串表示形式(如果您的列是日期时间,则可能必须强制转换astype(str),然后使用groupby.groups访问数据框作为字典,其中键是截断的日期值:

>>> df.groupby(df.Times.astype(str).str[0:13]).groups

{'2017-05-10 01': DatetimeIndex(['2017-05-10 01:01:03', '2017-05-10 01:05:00',
                '2017-05-10 01:06:10'],
               dtype='datetime64[ns]', name='time', freq=None),
 '2017-05-11 08': DatetimeIndex(['2017-05-11 08:25:20', '2017-05-11 08:30:14',
                '2017-05-11 08:30:35'],
               dtype='datetime64[ns]', name='time', freq=None)}