首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DataFrame划分Pandas DataFrame

如何使用DataFrame划分Pandas DataFrame
EN

Stack Overflow用户
提问于 2014-11-13 18:58:29
回答 1查看 2.5K关注 0票数 3

我正在编写一个Python脚本来从我的数码相机中导入图片,并且我正在使用Pandas来帮助对输入的图像进行簿记。我使用EXIF数据标记个别图像的信息,如相机模型,图像模式,图像格式和时间戳时,图像被获取的图像。这些数据用于将图像分隔到目录结构中。我正在苦苦挣扎的是如何使用Pandas来根据一组时间戳对图像进行分组,例如,这些时间戳都是在每小时半小时内完成的。举个例子,假设我有六张照片,其中三张是在九分钟内拍摄的,另外三张也是在九分钟内拍摄的,但一小时后。

代码语言:javascript
复制
import pandas
import datetime    
rawdata = [{'filename': 'image_1.jpg',
  'timestamp': datetime.datetime(2014, 11, 13, 19, 14, 16, 152847)},
 {'filename': 'image_2.jpg',
  'timestamp': datetime.datetime(2014, 11, 13, 19, 17, 16, 152847)},
 {'filename': 'image_3.jpg',
  'timestamp': datetime.datetime(2014, 11, 13, 19, 20, 16, 152847)},
 {'filename': 'image_4.jpg',
  'timestamp': datetime.datetime(2014, 11, 13, 20, 14, 16, 152847)},
 {'filename': 'image_5.jpg',
  'timestamp': datetime.datetime(2014, 11, 13, 20, 17, 16, 152847)},
 {'filename': 'image_6.jpg',
  'timestamp': datetime.datetime(2014, 11, 13, 20, 20, 16, 152847)}]
df = pandas.DataFrame(rawdata)

是否有一种自动的方法将这个DataFrame划分为半小时阈值,以便在一个DataFrame中有image_1、image_2和image_3,在第二个DataFrame中有image_4、image_5和image_6?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 19:16:43

IIUC,一种方法是使用diff-compare-cumsum成语获取集群号,然后您可以将其用于groupby

代码语言:javascript
复制
>>> df = df.sort("timestamp")
>>> cluster = (df["timestamp"].diff() > pd.Timedelta(minutes=30)).cumsum()
>>> dfs = [v for k,v in df.groupby(cluster)]
>>> for clust in dfs:
...     print(clust)
...     
      filename                  timestamp
0  image_1.jpg 2014-11-13 19:14:16.152847
1  image_2.jpg 2014-11-13 19:17:16.152847
2  image_3.jpg 2014-11-13 19:20:16.152847
      filename                  timestamp
3  image_4.jpg 2014-11-13 20:14:16.152847
4  image_5.jpg 2014-11-13 20:17:16.152847
5  image_6.jpg 2014-11-13 20:20:16.152847

这是因为False ~0和True ~ 1,所以如果我们用每次发现新集群时变成1的东西的累积和,我们将得到我们想要的ids:

代码语言:javascript
复制
>>> df["timestamp"].diff()
0        NaT
1   00:03:00
2   00:03:00
3   00:54:00
4   00:03:00
5   00:03:00
Name: timestamp, dtype: timedelta64[ns]
>>> df["timestamp"].diff() > pd.Timedelta(minutes=30)
0    False
1    False
2    False
3     True
4    False
5    False
Name: timestamp, dtype: bool
>>> (df["timestamp"].diff() > pd.Timedelta(minutes=30)).cumsum()
0    0
1    0
2    0
3    1
4    1
5    1
Name: timestamp, dtype: int64
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26916360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档