我有一个数据集,其中包含一个名为 DATE 的列。它只有一年,然后是一个破折号 (-),然后是两位数的月份 - 像这样:2002-03 或 2007-11。它是一个字符串,但使用 to_datetime 命令导致它选择每个月的第一天(额外添加一天)。我将 to_datetime 与格式命令 '%Y%m' 一起使用。最终,我真的只想按年份和月份对这一列进行排序,然后从另一列中获得该月份和年份中所有内容的平均值。我想我仍然可以这样做,即使随机添加了“天”日期,但这似乎不是一种非常干净的方法。我做错了什么?
答案 0 :(得分:1)
您可以使用 pd.to_datetime,它应该能够将数据转换为日期时间格式。
import pandas as pd
df = pd.DataFrame({'Date':['2020-10','2020-11','2020-12','2020-01','2021-02','2021-03']})
print (df)
df['Date'] = pd.to_datetime(df['Date'])
print (df)
字符串格式的DataFrame:
Date
0 2020-10
1 2020-11
2 2020-12
3 2020-01
4 2021-02
5 2021-03
日期格式的DataFrame:
Date
0 2020-10-01
1 2020-11-01
2 2020-12-01
3 2020-01-01
4 2021-02-01
5 2021-03-01
如果你想按日期对它们进行排序,你可以这样做:
df = df.sort_values ('Date')
print (df)
请注意,第 4 个值是 2020-01-01
并且会在 df.sort_values
之后排在最前面
输出结果为:
Date
3 2020-01-01
0 2020-10-01
1 2020-11-01
2 2020-12-01
4 2021-02-01
5 2021-03-01
如果您想重置索引,可以使用 .reset_index(drop=True)
如果你想将字符串值转换为Date格式,但仍保持YYYY-MM结构,可以使用
df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%Y-%m')
但是,这会将 Date
列转换为字符串格式而不是日期时间。
如果你想计算年月的平均值,那么你可以简单地使用 Date
列上的 groupby 如下:
import pandas as pd
df = pd.DataFrame({'Date':['2020-10','2020-11','2020-12','2020-01','2021-02',
'2021-03','2020-10','2020-12','2020-11','2021-02'],
'Score':[400,500,300,200,400,300,200,300,400,300]})
df['Date'] = pd.to_datetime(df['Date'],format='%Y-%m') #.dt.strftime('%Y-%m')
#df = df.sort_values ('Date').reset_index(drop=True)
print (df.groupby('Date')['Score'].mean().reset_index().rename(columns={'Score':'mean_score'}))
输出结果为:
原始数据帧:
Date Score
0 2020-10 400
1 2020-11 500
2 2020-12 300
3 2020-01 200
4 2021-02 400
5 2021-03 300
6 2020-10 200
7 2020-12 300
8 2020-11 400
9 2021-02 300
每个月的分组日期和平均值:
Date mean_score
0 2020-01-01 200
1 2020-10-01 300
2 2020-11-01 450
3 2020-12-01 300
4 2021-02-01 350
5 2021-03-01 300
答案 1 :(得分:1)
假设您的数据框如下所示
import pandas as pd
df = pd.DataFrame({'date':['2021-01','2021-02','2021-03','2021-04']})
pd.Period
df['date_period'] = pd.to_datetime(df['date'],format='%Y-%m').dt.to_period('M')
您可以通过
访问年份和月份df['year'] = df['date_period'].dt.year
df['month'] = df['date_period'].dt.month
df['date_int'] = df['date'].str.replace('-','').astype(int)
您可以通过
访问年份和月份df['year'] = df['date_int'] // 100
df['month'] = df['date_int'] % 100
结果如下:
date date_period date_int
0 2021-01 2021-01 202101
1 2021-02 2021-02 202102
2 2021-03 2021-03 202103
3 2021-04 2021-04 202104
第二个选项大约是第一个选项的两倍:
%timeit pd.to_datetime(df['date'],format='%Y-%m').dt.to_period('M')
每个循环 703 µs ± 78.7 µs(平均值 ± 标准偏差,7 次运行,每次 1000 次循环)
%timeit df['date'].str.replace('-','').astype(int)
每个循环 304 µs ± 8.2 µs(平均值 ± 标准偏差,7 次运行,每次 1000 次循环)