我有一个大概如此的numpy数组:
data
array([(datetime.datetime(2009, 1, 6, 2, 30), 17924.0, 0.0),....
(datetime.datetime(2009, 1, 29, 16, 30), 35249.2, 521.25],
dtype=[('timestamp', '|O4'), ('x1', '<f8'), ('x2', '<f8')])
我希望能够根据第一列(即使用datetime对象)索引数据,因此我可以访问特定的年/月/日数据,如下所示:
data[data['timestamp'].year == 2009]
这显然不起作用。我唯一能想到的就是添加额外的列(例如“年”列),这样就可以了:
data[data['year'] == 2009]
似乎是一种相当低效的处理方式(并且会复制大量数据) - 特别是如果我想在所有其他时间间隔上编制索引...是否有更好的方法来执行此操作?
提前致谢。
答案 0 :(得分:3)
使用pandas。 “pandas是一个开源的BSD许可库,为Python编程语言提供高性能,易用的数据结构和数据分析工具。”
文档中有大量示例,但您可以按照以下方式执行您要执行的操作:
import pandas
import numpy as np
import datetime as dt
# example values
dates = np.asarray(pandas.date_range('1/1/2000', periods=8))
# create a dataframe
df = pandas.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
# date you want
date=dt.datetime(2000,1,2)
# magic :)
print df.xs(date)
我建议尽快学习这个模块。这绝对是特殊的。这是一个非常简单的例子。查看非常详尽的文档。
答案 1 :(得分:1)
好吧所以我认为我解决了这个问题(使用pandas,如上面strimp099所建议的),具体来说,使用“GroupBy”对象(pandas: Group By: split-apply-combine)
详细说明上面使用的例子:
import pandas
import numpy as np
import datetime as dt
# example values
dates = np.asarray(pandas.DateRange('1/1/2000', periods=200))
# create a dataframe
df = pandas.DataFrame(np.random.randn(200, 4), index=dates, columns=['A', 'B', 'C', 'D'])
# create a GroupBy object
grouped_data = df.groupby(lambda x: x.month)
#magic
grouped_data.mean()
A B C D
month
1 -0.492648 -0.038257 -0.224924 0.130182
2 -0.178995 0.236042 -0.471791 -0.369913
3 -0.261866 -0.024680 -0.107211 -0.195742
4 0.215505 0.077079 -0.057511 0.146193
5 -0.097043 -0.335736 0.302811 0.120170
6 0.187583 0.221954 -0.290655 -0.077800
7 -0.134988 0.013719 -0.094334 -0.107402
8 -0.229138 0.056588 -0.156174 -0.067655
9 0.043746 0.077781 0.230035 0.344440
10 -0.533137 -0.683788 0.395286 -0.957894
(即按月分组的数据的平均值)
此外,要进行多次分组(即在我的情况下是年份和月份),这可能会有所帮助:
grouped_data = df.groupby(lambda x: (x.year,x.month))
干杯!
答案 2 :(得分:0)
您还可以在numpy中使用datetime dtype。我没有对这两种方法进行基准测试,但它们可能非常接近。这是一个例子:
import datetime
import numpy as np
def data_in(dates, year=2009):
""" Return the dates within the given year.
Works only with dates being a numpy array with a datetime dtype.
"""
from_date = np.array(('{}-01-01'.format(year), ), dtype='M8')
to_date = np.array(('{}-12-31'.format(year),), dtype='M8')
return dates[(dates > from_date) & (dates < to_date)]
if __name__ == '__main__':
data = np.array(
[
(datetime.datetime(2009, 1, 6, 2, 30), 17924.0, 0.0),
(datetime.datetime(2009, 1, 29, 16, 30), 35249.2, 521.25),
(datetime.datetime(2011, 1, 29, 16, 30), 35249.2, 521.25),
],
dtype=[('timestamp', 'M8'), ('x1', '<f8'), ('x2', '<f8')]
)
for year in [2009, 2010, 2011]:
print ' Timestamps in {}:\n {}'.format( year, data_in(data['timestamp'], year))