给出以下示例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中对此子集进行迭代,对于同样具有日期/小时作为公共标识符的多个日期/时间?
答案 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)}