Pandas数据处理(4):时间数据处理与分组聚合

8、时间数据处理

import pandas as pd
d=pd.Timestamp("2026.3.31 22:26")
print(d)
print(type(d))
print(d.year,d.month,d.day,d.hour,d.minute,d.second,d.quarter)
print(F"是否月底:{d.is_month_end}")
print(F"星期几:{d.day_name()}")
print(F"转化为天:{d.to_period("D")}")
print(F"转化为季度:{d.to_period("Q")}")
print(F"转化为月度:{d.to_period("M")}")
print(F"转化为年度:{d.to_period("Y")}")
print(F"转化为周维度:{d.to_period("W")}")

2026-03-31 22:26:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
2026 3 31 22 26 0 1
是否月底:True
星期几:Tuesday
转化为天:2026-03-31
转化为季度:2026Q1
转化为月度:2026-03
转化为年度:2026
转化为周维度:2026-03-30/2026-04-05

#字符串转timestep
a=pd.to_datetime("2026.3.31 22:26")
print(a,type(a))

2026-03-31 22:26:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>

#dataframe日期转换
df=pd.DataFrame({
    "sales":[1,2,3],
    "date":["20260101","20260102","20260103"]
})
df["datatime"]=pd.to_datetime(df["date"])
df["week"]=df["datatime"].dt.day_name()
print(df)

sales date datatime week
0 1 20260101 2026-01-01 Thursday
1 2 20260102 2026-01-02 Friday
2 3 20260103 2026-01-03 Saturday

# #csv日期转换
# df1=pd.read_csv("data/employees.csv",parse_dates=["hire_date"])
# print(type(df1["hire_date"].values[0]))
#相当于以下字段(上边的方法不稳定)
df1=pd.read_csv("data/employees.csv")
df1["date_time"]=pd.to_datetime(df1.hire_date)
df1["week"]=df1["date_time"].dt.day_name()
#日期数据做索引
df1.set_index("hire_date",inplace=True)
df1

employee_id name department position salary date_time week
hire_date
2022-02-02 EMP001 赵洋 产品部 数据分析师 3765 2022-02-02 Wednesday
2021-11-25 EMP002 周磊 运营部 数据运营 5772 2021-11-25 Thursday
2024-09-29 EMP003 刘洋 产品部 需求分析师 2608 2024-09-29 Sunday
2023-12-08 EMP004 吴伟 市场部 活动执行 4699 2023-12-08 Friday
2023-09-19 EMP005 张勇 人事部 培训专员 9277 2023-09-19 Tuesday
... ... ... ... ... ... ... ...
2023-01-15 EMP096 李敏 销售部 销售主管 9922 2023-01-15 Sunday
2021-07-27 EMP097 赵静 销售部 区域经理 6566 2021-07-27 Tuesday
2022-01-29 EMP098 周娜 运营部 用户运营 2004 2022-01-29 Saturday
2023-05-31 EMP099 王娜 销售部 大客户销售 3567 2023-05-31 Wednesday
2024-04-01 EMP100 吴芳 运营部 商家运营 4993 2024-04-01 Monday

100 rows × 7 columns

df1.loc["2022-02-02":"2023-05-31"]

employee_id name department position salary date_time week
hire_date
2022-02-02 EMP001 赵洋 产品部 数据分析师 3765 2022-02-02 Wednesday
2021-11-25 EMP002 周磊 运营部 数据运营 5772 2021-11-25 Thursday
2024-09-29 EMP003 刘洋 产品部 需求分析师 2608 2024-09-29 Sunday
2023-12-08 EMP004 吴伟 市场部 活动执行 4699 2023-12-08 Friday
2023-09-19 EMP005 张勇 人事部 培训专员 9277 2023-09-19 Tuesday
... ... ... ... ... ... ... ...
2021-09-02 EMP095 王静 市场部 活动执行 5707 2021-09-02 Thursday
2023-01-15 EMP096 李敏 销售部 销售主管 9922 2023-01-15 Sunday
2021-07-27 EMP097 赵静 销售部 区域经理 6566 2021-07-27 Tuesday
2022-01-29 EMP098 周娜 运营部 用户运营 2004 2022-01-29 Saturday
2023-05-31 EMP099 王娜 销售部 大客户销售 3567 2023-05-31 Wednesday

99 rows × 7 columns

#datetime计算时间间隔
d1=pd.Timestamp("2021-09-02")
d2=pd.Timestamp("2023-05-31")
print(d2-d1)
print(type(d2-d1))

636 days 00:00:00
<class 'pandas._libs.tslibs.timedeltas.Timedelta'>

df["delta_days"]=df.datatime-df.datatime[0]
df.set_index("delta_days",inplace=True)
df

sales date datatime week
delta_days
0 days 1 20260101 2026-01-01 Thursday
1 days 2 20260102 2026-01-02 Friday
2 days 3 20260103 2026-01-03 Saturday
print(df.loc["1 days":"2 days"])

sales date datatime week
delta_days
1 days 2 20260102 2026-01-02 Friday
2 days 3 20260103 2026-01-03 Saturday

#生成时间序列
days=pd.date_range("2026-01-01 00:01",periods=20,freq="W")
days

DatetimeIndex(['2026-01-04 00:01:00', '2026-01-11 00:01:00',
'2026-01-18 00:01:00', '2026-01-25 00:01:00',
'2026-02-01 00:01:00', '2026-02-08 00:01:00',
'2026-02-15 00:01:00', '2026-02-22 00:01:00',
'2026-03-01 00:01:00', '2026-03-08 00:01:00',
'2026-03-15 00:01:00', '2026-03-22 00:01:00',
'2026-03-29 00:01:00', '2026-04-05 00:01:00',
'2026-04-12 00:01:00', '2026-04-19 00:01:00',
'2026-04-26 00:01:00', '2026-05-03 00:01:00',
'2026-05-10 00:01:00', '2026-05-17 00:01:00'],
dtype='datetime64[ns]', freq='W-SUN')

9、分组聚合

计算不同部门的平均薪资

df=pd.read_csv("data/employees.csv")
df

employee_id name department position salary hire_date
0 EMP001 赵洋 产品部 数据分析师 3765 2022-02-02
1 EMP002 周磊 运营部 数据运营 5772 2021-11-25
2 EMP003 刘洋 产品部 需求分析师 2608 2024-09-29
3 EMP004 吴伟 市场部 活动执行 4699 2023-12-08
4 EMP005 张勇 人事部 培训专员 9277 2023-09-19
... ... ... ... ... ... ...
95 EMP096 李敏 销售部 销售主管 9922 2023-01-15
96 EMP097 赵静 销售部 区域经理 6566 2021-07-27
97 EMP098 周娜 运营部 用户运营 2004 2022-01-29
98 EMP099 王娜 销售部 大客户销售 3567 2023-05-31
99 EMP100 吴芳 运营部 商家运营 4993 2024-04-01

100 rows × 6 columns

#分组
df.groupby("department").groups

{'产品部': [0, 2, 8, 15, 20, 32, 34, 44, 47, 48, 53, 55, 58, 63, 72, 75, 80, 86], '人事部': [4, 5, 16, 19, 26, 42, 68, 70, 79, 81, 84, 90, 93], '市场部': [3, 6, 9, 10, 12, 13, 17, 28, 29, 41, 51, 52, 65, 66, 67, 69, 82, 91, 94], '技术部': [7, 21, 23, 24, 31, 35, 57, 61, 76, 78], '财务部': [14, 25, 46, 49, 56, 62, 71, 74, 85], '运营部': [1, 11, 30, 33, 38, 40, 45, 50, 59, 73, 83, 88, 92, 97, 99], '销售部': [18, 22, 27, 36, 37, 39, 43, 54, 60, 64, 77, 87, 89, 95, 96, 98]}

#查找小组成员
df.groupby("department").get_group("产品部").head()

employee_id name department position salary hire_date
0 EMP001 赵洋 产品部 数据分析师 3765 2022-02-02
2 EMP003 刘洋 产品部 需求分析师 2608 2024-09-29
8 EMP009 王伟 产品部 产品助理 3068 2023-06-24
15 EMP016 李敏 产品部 需求分析师 2425 2021-09-29
20 EMP021 黄芳 产品部 产品经理 11242 2023-12-08
#通过薪资进行聚合
df3=df.groupby("department")[["salary"]].mean().round(2)
df3

salary
department
产品部 7445.28
人事部 6405.38
市场部 4135.47
技术部 4944.90
财务部 6824.22
运营部 4775.80
销售部 6308.06
df3.reset_index().sort_values("salary",ascending=0)

department salary
0 产品部 7445.28
4 财务部 6824.22
1 人事部 6405.38
6 销售部 6308.06
3 技术部 4944.90
5 运营部 4775.80
2 市场部 4135.47

多个条件分组并计算不同岗位平均薪资

df4=df.groupby(["department","position"])["salary"].mean().round(2)
df4.head(12)

department position
产品部 产品助理 3839.67
产品经理 13981.83
数据分析师 4686.80
需求分析师 3792.75
人事部 HRBP 3488.00
培训专员 9201.33
招聘专员 6698.14
薪酬绩效 2645.50
市场部 品牌推广 6000.00
市场策划 3910.71
新媒体运营 3866.00
活动执行 4311.50
Name: salary, dtype: float64

df4.sort_values(ascending=0).head(5)

department position
产品部 产品经理 13981.83
财务部 财务主管 11072.25
销售部 销售主管 9922.00
技术部 运维工程师 9762.50
人事部 培训专员 9201.33
Name: salary, dtype: float64


posted @ 2026-03-06 23:29  wangzy336  阅读(13)  评论(0)    收藏  举报