为什么函数在元素上工作但不在数组上工作?

时间:2017-01-30 19:44:24

标签: python arrays pandas numpy

我对何时可以将函数应用于数组元素而不是整个数组感到困惑。对于exapmle:

我有一个时间戳的数据框,我想在数据帧中获取独特的日期和星期几。拉出日期非常简单:

dates_only = df.dtime.dt.date.unique()

那时:

print type(dates_only)           -> <type 'numpy.ndarray'> 
print type(dates_only[0])        -> <type 'datetime.date'>
print dates_only[0].weekday()    -> 4

但我无法通过应用工作日功能创建新系列:

dow = dates_only.weekday() 

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-10-76986b9b07a2> in <module>()
----> 4 dow = dates_only.weekday()

AttributeError: 'numpy.ndarray' object has no attribute 'weekday'

我是否需要以某种方式投射ndarray,或者我应该在循环中处理这些:

for i in range(len(dates_only)):
    dow[i] = dates_only[i].weekday()

我认为它会起作用,但它似乎错了......

感谢您的期待!

3 个答案:

答案 0 :(得分:1)

问题Order order = Ebean.find(Order.class, 12); order.setStatus("SHIPPED"); ... // update the order Ebean.save(order); 返回unique,但您可以将其转换为DatetimeIndex,然后使用DatetimeIndex.weekday,最后使用numpy array构造函数:

Series
start = pd.to_datetime('2015-02-24')
rng = pd.date_range(start, periods=10)
df = pd.DataFrame({'dtime': rng, 'a': range(10)})  
print (df)
   a      dtime
0  0 2015-02-24
1  1 2015-02-25
2  2 2015-02-26
3  3 2015-02-27
4  4 2015-02-28
5  5 2015-03-01
6  6 2015-03-02
7  7 2015-03-03
8  8 2015-03-04
9  9 2015-03-05

另一种解决方案是转换dates_only = pd.DatetimeIndex(df.dtime.dt.date.unique()) dow = dates_only.weekday print (dow) [1 2 3 4 5 6 0 1 2 3] dow = pd.Series(dates_only.weekday, index=df.index) print (dow) 0 1 1 2 2 3 3 4 4 5 5 6 6 0 7 1 8 2 9 3 dtype: int32 to_datetime,然后使用numpy array构造函数:

Series

答案 1 :(得分:0)

你有一组时间对象。

时间对象的方法是week_day():

dates_only = pd.Series(pd.to_datetime(df.dtime.dt.date.unique()), index=df.index)
print (dates_only)

dow = dates_only.dt.weekday
print (dow)
0    1
1    2
2    3
3    4
4    5
5    6
6    0
7    1
8    2
9    3
dtype: int64

但这并没有把时间对象的ARRAY变成时间对象!

换句话说:当你有一盒苹果时,这是否意味着你可以自己吃盒子?

有关可能的解决方案,请参阅here

答案 2 :(得分:0)

你不能像这样处理一个数组。您必须在编写时循环遍历数组(对我来说看起来不对)或使用map:

dow = map(lambda date: date.weekday(), dates_only)