从datetime类型的一个数据框列创建年,月,日

时间:2018-05-23 20:32:45

标签: python-3.x pandas dataframe

我有一个pandas数据框数据,其列有 MFR_DATE ,类型为datetime。我想创建其他列, MFR_YEAR MFR_MONTH MFR_DAY ,我使用以下3个语句来执行此操作。我想知道是否有更好的方法吗?

data['MFR_YEAR'] = data.MFR_DATE.apply(lambda t: t.year)
data['MFR_MONTH'] = data.MFR_DATE.apply(lambda t: t.month)
data['MFR_DAY'] = data.MFR_DATE.apply(lambda t: t.day)

3 个答案:

答案 0 :(得分:5)

使用矢量化Series.dt. accessor

data['MFR_YEAR'] = data['MFR_DATE'].dt.year
data['MFR_MONTH'] = data['MFR_DATE'].dt.month
data['MFR_DAY'] = data['MFR_DATE'].dt.day

可用方法和属性列表:

In [21]: df.MFR_DATE.dt.
       df.MFR_DATE.dt.ceil           df.MFR_DATE.dt.dayofweek      df.MFR_DATE.dt.floor          df.MFR_DATE.dt.is_month_end   df.MFR_DATE.dt.is_year_end
       df.MFR_DATE.dt.date           df.MFR_DATE.dt.dayofyear      df.MFR_DATE.dt.freq           df.MFR_DATE.dt.is_month_start df.MFR_DATE.dt.is_year_start
       df.MFR_DATE.dt.day            df.MFR_DATE.dt.days_in_month  df.MFR_DATE.dt.hour           df.MFR_DATE.dt.is_quarter_end df.MFR_DATE.dt.microsecond
       df.MFR_DATE.dt.day_name       df.MFR_DATE.dt.daysinmonth    df.MFR_DATE.dt.is_leap_year   df.M…t.is_quarter_start       df.MFR_DATE.dt.minute

答案 1 :(得分:3)

也许:

df = pd.DataFrame({'MFR_DATE':pd.date_range('2018-02-01',periods=40,freq='2M')})

df[['Year','Month','Day']] = df.MFR_DATE.apply(lambda x: pd.Series([x.year,x.month, x.day]))

输出:

     MFR_DATE  Year  Month  Day
0  2018-02-28  2018      2   28
1  2018-04-30  2018      4   30
2  2018-06-30  2018      6   30
3  2018-08-31  2018      8   31
4  2018-10-31  2018     10   31
5  2018-12-31  2018     12   31
6  2019-02-28  2019      2   28
7  2019-04-30  2019      4   30
8  2019-06-30  2019      6   30
9  2019-08-31  2019      8   31
10 2019-10-31  2019     10   31
11 2019-12-31  2019     12   31
12 2020-02-29  2020      2   29
13 2020-04-30  2020      4   30
14 2020-06-30  2020      6   30
15 2020-08-31  2020      8   31
16 2020-10-31  2020     10   31
17 2020-12-31  2020     12   31
18 2021-02-28  2021      2   28
19 2021-04-30  2021      4   30
20 2021-06-30  2021      6   30
21 2021-08-31  2021      8   31
22 2021-10-31  2021     10   31
23 2021-12-31  2021     12   31
24 2022-02-28  2022      2   28
25 2022-04-30  2022      4   30
26 2022-06-30  2022      6   30
27 2022-08-31  2022      8   31
28 2022-10-31  2022     10   31
29 2022-12-31  2022     12   31
30 2023-02-28  2023      2   28
31 2023-04-30  2023      4   30
32 2023-06-30  2023      6   30
33 2023-08-31  2023      8   31
34 2023-10-31  2023     10   31
35 2023-12-31  2023     12   31
36 2024-02-29  2024      2   29
37 2024-04-30  2024      4   30
38 2024-06-30  2024      6   30
39 2024-08-31  2024      8   31

答案 2 :(得分:2)

zip

data.assign(**dict(zip(
    ('year', 'month', 'day'),
    zip(*((x.year, x.month, x.day) for x in data.MFR_DATE))
)))

                    MFR_DATE  year  month  day
0 2018-05-23 13:34:49.460214  2018      5   23

dt.strftimestr.split

data[['year', 'month', 'day']] = \
    data.MFR_DATE.dt.strftime('%Y %m %d').str.split(expand=True).astype(int)

data

                    MFR_DATE  year  month  day
0 2018-05-23 13:34:49.460214  2018      5   23

设置

data = pd.DataFrame(dict(MFR_DATE=pd.date_range('now', periods=1)))