【问题标题】:Python Pandas. Date object split by separate columns.蟒蛇熊猫。日期对象按单独的列拆分。
【发布时间】:2018-10-10 14:24:26
【问题描述】:

我在 Python (pandas) 中有日期写为“2010 年 1 月 31 日”。要应用线性回归,我希望有 3 个单独的变量:天数、月数、年数。

将 pandas 中的日期列拆分为 3 列的方法是什么? 另一个问题是将相同的日子分成 3 组:1-10、11-20、21-31。

【问题讨论】:

  • 你能把第二个问题单独分开吗?它与第一个问题并没有真正的关系,它会使其他用户难以找到简单的 Q&A。

标签: python pandas datetime time-series pandas-groupby


【解决方案1】:
df['date'] = pd.to_datetime(df['date'])

#Create 3 additional columns
df['day'] = df['date'].dt.day
df['month'] = df['date'].dt.month
df['year'] = df['date'].dt.year

理想情况下,您无需创建 3 个额外的列即可执行此操作,您只需将 Series 传递给您的函数。

In [2]: pd.to_datetime('01/31/2010').day
Out[2]: 31

In [3]: pd.to_datetime('01/31/2010').month
Out[3]: 1

In [4]: pd.to_datetime('01/31/2010').year
Out[4]: 2010

【讨论】:

  • 您可以考虑在对to_datetime的调用中使用format='%m/%d/%Y'明确指定您的日期格式
  • @iDrwish,您介意将 OP 的问题分成 2 份(甚至可以自己进行问答)吗?原因是人们将无法找到包含多个问题的简单问答。而且,当然,您可能应该为每个解决方案投赞成票..
  • @jpp 感谢您指出这一点,我相应地编辑了我的答案。
  • @iDrwish,当然,我真的不想让你失去你对第二位的好答案。所以如果 OP 没有提出新问题,请随意自己做!
  • 其实第二个Q&A是根据你@jpp今天早些时候给出的答案改编的,所以没有损失任何价值。
【解决方案2】:

这只会回答您的第一个问题

一种解决方案是使用operator.attrgetter 提取pd.Timestamp 对象的属性。

这种方法的好处是您可以轻松扩展/更改您需要的属性。此外,逻辑并不特定于对象类型。

from operator import attrgetter
import pandas as pd

df = pd.DataFrame({'date': ['1/21/2010', '5/5/2015', '4/30/2018']})

df['date'] = pd.to_datetime(df['date'], format='%m/%d/%Y')

attr_list = ['day', 'month', 'year']
attrs = attrgetter(*attr_list)
df[attr_list] = df['date'].apply(attrs).apply(pd.Series)

print(df)

        date  day  month  year
0 2010-01-21   21      1  2010
1 2015-05-05    5      5  2015
2 2018-04-30   30      4  2018

【讨论】:

    【解决方案3】:
    from datetime import datetime
    import pandas as pd
    
    df = pd.DataFrame({'yyyymmdd': ['20150204', '20160305']})
    for col, field in [("year", "%Y"), ("month", "%m"), ("day", "%d")]:
        df[col] = df["yyyymmdd"].apply(
            lambda cell: datetime.strptime(cell, "%Y%m%d").strftime(field))
        
    print(df)
    
       yyyymmdd  year month day
    0  20150204  2015    02  04
    1  20160305  2016    03  05
    

    【讨论】:

      猜你喜欢
      • 2021-02-18
      • 2021-02-09
      • 2016-10-16
      • 2021-11-09
      • 1970-01-01
      • 2019-09-10
      • 2022-12-13
      • 2019-11-05
      • 1970-01-01
      相关资源
      最近更新 更多