Python 在Numpy Datetime数组中查找唯一日期
我有时间序列数据(历元,值),我已经转换成(日期时间,值),它存储在Numpy数组中。现在,我希望找到与给定日期对应的第一行的索引。因此,每天只需要一个索引 下面是一个纯Python函数,速度非常慢Python 在Numpy Datetime数组中查找唯一日期,python,numpy,scipy,pandas,Python,Numpy,Scipy,Pandas,我有时间序列数据(历元,值),我已经转换成(日期时间,值),它存储在Numpy数组中。现在,我希望找到与给定日期对应的第一行的索引。因此,每天只需要一个索引 下面是一个纯Python函数,速度非常慢 def day_wise_datetime(datetimes,dataseries): unique_dates=[] unique_indices=[] for i in range(len(datetimes)): if datetimes[i].day
def day_wise_datetime(datetimes,dataseries):
unique_dates=[]
unique_indices=[]
for i in range(len(datetimes)):
if datetimes[i].day not in unique_dates:
unique_dates.append(datetimes[i])
unique_indices.append(i)
return [unique_dates,unique_indices]
Numpy提供了一个唯一的方法,但是它说它不能对datetime进行排序。那么什么基于Numpy的技术可以用于相同的目的呢
我知道推荐使用熊猫,但在我学习的过程中,我想知道一些NumPy/SciPy解决方案是否足够
编辑
datetimes变量中的值如下所示。我刚刚切掉了前五个元素
[datetime.datetime(2011, 4, 18, 18, 52, 9),
datetime.datetime(2011, 4, 18, 18, 52, 10),
datetime.datetime(2011, 4, 18, 18, 52, 11),
datetime.datetime(2011, 4, 18, 18, 52, 12),
datetime.datetime(2011, 4, 18, 18, 52, 13)]
的DataFrame提供了可以轻松实现目标的功能:
In [121]: arr1 = np.array([dt.datetime(2013, 1, 1), dt.datetime(2013, 1, 1), dt.datetime(2013, 1, 2)])
In [122]: arr2 = np.array([1, 2, 3])
In [123]: df = pd.DataFrame({'date': arr1, 'value': arr2})
In [124]: df
Out[124]:
date value
0 2013-01-01 00:00:00 1
1 2013-01-01 00:00:00 2
2 2013-01-02 00:00:00 3
In [125]: df.drop_duplicates('date')
Out[125]:
date value
0 2013-01-01 00:00:00 1
2 2013-01-02 00:00:00 3
编辑
我一开始就误解了你的问题。请尝试以下方法:
似乎排序是您的主要问题之一,我创建了一个反向日期时间列表示例:
In [74]: now = dt.datetime.utcnow()
In [75]: datetimes = [now - dt.timedelta(hours=6) * i for i in range(10)]
In [76]: datetimes
Out[76]:
[datetime.datetime(2013, 5, 8, 16, 47, 32, 60500),
datetime.datetime(2013, 5, 8, 10, 47, 32, 60500),
datetime.datetime(2013, 5, 8, 4, 47, 32, 60500),
datetime.datetime(2013, 5, 7, 22, 47, 32, 60500),
datetime.datetime(2013, 5, 7, 16, 47, 32, 60500),
datetime.datetime(2013, 5, 7, 10, 47, 32, 60500),
datetime.datetime(2013, 5, 7, 4, 47, 32, 60500),
datetime.datetime(2013, 5, 6, 22, 47, 32, 60500),
datetime.datetime(2013, 5, 6, 16, 47, 32, 60500),
datetime.datetime(2013, 5, 6, 10, 47, 32, 60500)]
通过datetimes
创建DataFrame
,并将列名设置为date
:
In [81]: df = pd.DataFrame(datetimes, columns=['date'])
In [82]: df
Out[82]:
date
0 2013-05-08 16:47:32.060500
1 2013-05-08 10:47:32.060500
2 2013-05-08 04:47:32.060500
3 2013-05-07 22:47:32.060500
4 2013-05-07 16:47:32.060500
5 2013-05-07 10:47:32.060500
6 2013-05-07 04:47:32.060500
7 2013-05-06 22:47:32.060500
8 2013-05-06 16:47:32.060500
9 2013-05-06 10:47:32.060500
接下来,按date
列对数据帧进行排序:
In [83]: df = df.sort('date')
然后为索引
添加一个新列:
In [85]: df['index'] = df['date'].apply(lambda x:x.day)
In [86]: df
Out[86]:
date index
9 2013-05-06 10:47:32.060500 6
8 2013-05-06 16:47:32.060500 6
7 2013-05-06 22:47:32.060500 6
6 2013-05-07 04:47:32.060500 7
5 2013-05-07 10:47:32.060500 7
4 2013-05-07 16:47:32.060500 7
3 2013-05-07 22:47:32.060500 7
2 2013-05-08 04:47:32.060500 8
1 2013-05-08 10:47:32.060500 8
0 2013-05-08 16:47:32.060500 8
In [87]: df = df.groupby('index').first()
In [88]: df
Out[88]:
date
index
6 2013-05-06 10:47:32.060500
7 2013-05-07 04:47:32.060500
8 2013-05-08 04:47:32.060500
然后按索引对数据进行分组,然后为每组获取第一个数据。如果您熟悉SQL,它就像从表组中按表选择第一个(*)一样
In [85]: df['index'] = df['date'].apply(lambda x:x.day)
In [86]: df
Out[86]:
date index
9 2013-05-06 10:47:32.060500 6
8 2013-05-06 16:47:32.060500 6
7 2013-05-06 22:47:32.060500 6
6 2013-05-07 04:47:32.060500 7
5 2013-05-07 10:47:32.060500 7
4 2013-05-07 16:47:32.060500 7
3 2013-05-07 22:47:32.060500 7
2 2013-05-08 04:47:32.060500 8
1 2013-05-08 10:47:32.060500 8
0 2013-05-08 16:47:32.060500 8
In [87]: df = df.groupby('index').first()
In [88]: df
Out[88]:
date
index
6 2013-05-06 10:47:32.060500
7 2013-05-07 04:47:32.060500
8 2013-05-08 04:47:32.060500
现在您可以获得唯一索引:
In [91]: df.index.values
Out[91]: array([6, 7, 8])
并获得独特的日期:
In [92]: df['date'].values
Out[92]:
array(['2013-05-06T18:47:32.060500000+0800',
'2013-05-07T12:47:32.060500000+0800',
'2013-05-08T12:47:32.060500000+0800'], dtype='datetime64[ns]')
可以提供一个简单的示例输入吗?@waitingkuo:添加了示例输入我的答案可以解决您的问题吗?因为我需要在一天内对所有记录进行数据处理,如平均和其他操作,所以我不想删除其他数据。此外,我的datetime对象还包含小时、分钟、秒信息。它只生成一个新对象,而不替换原始对象。