我正在编写一个Python脚本来从我的数码相机中导入图片,并且我正在使用Pandas来帮助对输入的图像进行簿记。我使用EXIF数据标记个别图像的信息,如相机模型,图像模式,图像格式和时间戳时,图像被获取的图像。这些数据用于将图像分隔到目录结构中。我正在苦苦挣扎的是如何使用Pandas来根据一组时间戳对图像进行分组,例如,这些时间戳都是在每小时半小时内完成的。举个例子,假设我有六张照片,其中三张是在九分钟内拍摄的,另外三张也是在九分钟内拍摄的,但一小时后。
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?
发布于 2014-11-13 19:16:43
IIUC,一种方法是使用diff-compare-cumsum成语获取集群号,然后您可以将其用于groupby。
>>> 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:
>>> 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: int64https://stackoverflow.com/questions/26916360
复制相似问题