我有一个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)
答案 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.strftime
和str.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)))