Python - 遍历属性列表

标签 python pandas datetime lambda apply

我的数据集中有一个特征,它是一个 pandas 时间戳对象。它具有(除其他外)以下属性:年、小时、星期几、月。

我可以使用一些强力方法基于这些属性创建新特征:

df["year"] = df["timeStamp"].apply(lambda x : x.year)

df["hour"] = df["timeStamp"].apply(lambda x : x.hour)

. . .

但是,我想遍历一个列表:

nomtimes = ["year", "hour", "month", "dayofweek"]


for i in nomtimes:

  df[i] = df["timeStamp"].apply(lambda x : x.i)

我收到以下 AttributeError:“Timestamp”对象没有属性“i”,我明白了为什么会出现此错误。

如何让引用的字符串取消引用,以便我可以将其作为属性传递?

最佳答案

不要在此处使用.apply,pandas 有各种内置实用程序来处理日期时间对象,请在系列对象上使用dt 属性:

In [11]: start = datetime(2011, 1, 1)
    ...: end = datetime(2012, 1, 1)
    ...:

In [12]: df = pd.DataFrame({'data':pd.date_range(start, end)})

In [13]: df.dtypes
Out[13]:
data    datetime64[ns]
dtype: object

In [14]: df['year'] = df.data.dt.year

In [15]: df['hour'] = df.data.dt.hour

In [16]: df['month'] = df.data.dt.month

In [17]: df['dayofweek'] = df.data.dt.dayofweek

In [18]: df.head()
Out[18]:
        data  year  hour  month  dayofweek
0 2011-01-01  2011     0      1          5
1 2011-01-02  2011     0      1          6
2 2011-01-03  2011     0      1          0
3 2011-01-04  2011     0      1          1
4 2011-01-05  2011     0      1          2

或者,根据需要使用 getattr 动态:

In [24]: df = pd.DataFrame({'data':pd.date_range(start, end)})

In [25]: nomtimes = ["year", "hour", "month", "dayofweek"]
    ...:

In [26]: df.head()
Out[26]:
        data
0 2011-01-01
1 2011-01-02
2 2011-01-03
3 2011-01-04
4 2011-01-05

In [27]: for t in nomtimes:
    ...:     df[t] = getattr(df.data.dt, t)
    ...:

In [28]: df.head()
Out[28]:
        data  year  hour  month  dayofweek
0 2011-01-01  2011     0      1          5
1 2011-01-02  2011     0      1          6
2 2011-01-03  2011     0      1          0
3 2011-01-04  2011     0      1          1
4 2011-01-05  2011     0      1          2

如果你必须使用单线,请使用:

In [30]: df = pd.DataFrame({'data':pd.date_range(start, end)})

In [31]: df.head()
Out[31]:
        data
0 2011-01-01
1 2011-01-02
2 2011-01-03
3 2011-01-04
4 2011-01-05

In [32]: df = df.assign(**{t:getattr(df.data.dt,t) for t in nomtimes})

In [33]: df.head()
Out[33]:
        data  dayofweek  hour  month  year
0 2011-01-01          5     0      1  2011
1 2011-01-02          6     0      1  2011
2 2011-01-03          0     0      1  2011
3 2011-01-04          1     0      1  2011
4 2011-01-05          2     0      1  2011

关于Python - 遍历属性列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51911124/

相关文章:

python - 如何从 pandas 数据框中的时间戳中提取月份?

mysql - 如何将 MySQL 中的值增加到将来的某个时间?

python - 将 Rasa 聊天机器人连接到 Webchat

python - Django 模型 (1054, "Unknown column in ' 字段列表'")

python - 如何在抽象类中调用非抽象方法?

python - argparse:如何要求一组并非全部互斥且并非全部可选的参数?

python - 在 Pandas 中有带有下标/索引的列

python - Pandas dataframe.plot() - 折线图 - 未为前两个索引绘制的系列值

MySQL 日期时间算法

java - 将给定日期转换为通用日期格式?