numpy沿着轴不适用于工作日

时间:2018-01-30 00:19:54

标签: python pandas numpy datetime weekday

我有一个numpy数组:

>>> type(dat)
Out[41]: numpy.ndarray

>>> dat.shape
Out[46]: (127L,)

>>> dat[0:3]
Out[42]: array([datetime.date(2010, 6, 11), datetime.date(2010, 6, 19), datetime.date(2010, 6, 30)], dtype=object)

我想在这个数组中得到每个日期的工作日,如下所示:

>>> dat[0].weekday()
Out[43]: 4

我尝试使用以下但没有工作:

import pandas as pd
import numpy as np
import datetime as dt

np.apply_along_axis(weekday,0,dat)
NameError: name 'weekday' is not defined

np.apply_along_axis(dt.weekday,0,dat)
AttributeError: 'module' object has no attribute 'weekday'

np.apply_along_axis(pd.weekday,1,dat)
AttributeError: 'module' object has no attribute 'weekday'

np.apply_along_axis(lambda x: x.weekday(),0,dat)
AttributeError: 'numpy.ndarray' object has no attribute 'weekday'

np.apply_along_axis(lambda x: x.dt.weekday,0,dat)
AttributeError: 'numpy.ndarray' object has no attribute 'dt'

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

对于1d数组,

np.apply_along_axis没有多大意义。在2d或更高的数组中,它将该函数应用于该数组中的1d切片。关于这个功能:

  

此功能应接受1-D阵列。它适用于1-D           沿指定轴的arr切片。

即使在运行nameerror之前,也会生成此apply。您没有定义weekday函数:

np.apply_along_axis(weekday,0,dat)
NameError: name 'weekday' is not defined

weekday是日期的方法,而不是dt模块中的函数:

np.apply_along_axis(dt.weekday,0,dat)
AttributeError: 'module' object has no attribute 'weekday'

它没有在熊猫中定义:

np.apply_along_axis(pd.weekday,1,dat)
AttributeError: 'module' object has no attribute 'weekday'

这看起来更好,但apply_along_axis将数组(1d)传递给lambdaweekday不是数组方法。

np.apply_along_axis(lambda x: x.weekday(),0,dat)
AttributeError: 'numpy.ndarray' object has no attribute 'weekday'

数组也没有dt属性。

np.apply_along_axis(lambda x: x.dt.weekday,0,dat)
AttributeError: 'numpy.ndarray' object has no attribute 'dt'

所以,让我们忘掉apply_along_axis

定义一个样本,首先是列表,然后是对象数组:

In [231]: alist = [datetime.date(2010, 6, 11), datetime.date(2010, 6, 19), datetime.date(2010, 6, 30)]
In [232]: data = np.array(alist)
In [233]: data
Out[233]: 
array([datetime.date(2010, 6, 11), datetime.date(2010, 6, 19),
       datetime.date(2010, 6, 30)], dtype=object)

为方便起见,weekday的lambda版本:

In [234]: L = lambda x: x.weekday()

这可以通过多种方式迭代应用:

In [235]: [L(x) for x in alist]
Out[235]: [4, 5, 2]
In [236]: [L(x) for x in data]
Out[236]: [4, 5, 2]
In [237]: np.vectorize(L)(data)
Out[237]: array([4, 5, 2])
In [238]: np.frompyfunc(L,1,1)(data)
Out[238]: array([4, 5, 2], dtype=object)

我刚刚对3000项目列表进行了时间测试。列表理解速度最快(正如我从过去的测试中预期的那样),但时间差异并不大。消费者最大的时间是x.weekday() 3000次。

答案 1 :(得分:1)

您可以尝试对工作日函数进行矢量化,以便将元素元素应用于数组。

weekday_func = lambda x: x.weekday()
get_weekday = np.vectorize(weekday_func)
get_weekday(dat)