说我有以下DataFrame:

df = pd.DataFrame("x":[pd.Timestamp("2016-03-18")])


如何访问存储在x列中的datetime对象的属性?也就是说,我想要

df.x[0].weekofyear # returns 9


但是对于整个专栏。显然,df.x.weekofyear不起作用,因为df.x是一个序列而不是日期时间对象,并且df.x.apply(pd.Timestamp.weekofyear)也不能工作,因为weekofyear是一个属性而不是一个函数。

我能想到的解决方案是定义一个函数来访问属性,然后将其应用为:

def get_week(x):
    return x.weekofyear

df.x.apply(get_week) # returns series of weeks


看来这有点round回和冗长,而我的经验是,每当我执行此类操作时,pandas已经具有一种超高效的内置方法来执行此操作-在这种情况下是否有这种方法?

最佳答案

使用向量化的.dt.weekofyear

因此df['x'].dt.weekofyear将返回整列:

In [119]:
df = pd.DataFrame({'dates': pd.date_range(dt.datetime(2016,1,1), dt.datetime(2016,1,20))})
df

Out[119]:
        dates
0  2016-01-01
1  2016-01-02
2  2016-01-03
3  2016-01-04
4  2016-01-05
5  2016-01-06
6  2016-01-07
7  2016-01-08
8  2016-01-09
9  2016-01-10
10 2016-01-11
11 2016-01-12
12 2016-01-13
13 2016-01-14
14 2016-01-15
15 2016-01-16
16 2016-01-17
17 2016-01-18
18 2016-01-19
19 2016-01-20

In [120]:
df['dates'].dt.weekofyear

Out[120]:
0     53
1     53
2     53
3      1
4      1
5      1
6      1
7      1
8      1
9      1
10     2
11     2
12     2
13     2
14     2
15     2
16     2
17     3
18     3
19     3
Name: dates, dtype: int64

关于python - 有效访问 Pandas 列中对象的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36081217/

10-13 03:43