字符串到日期,但只有月份和年份

时间:2021-03-23 00:42:13

标签: python pandas

我有一个数据集,其中包含一个名为 DATE 的列。它只有一年,然后是一个破折号 (-),然后是两位数的月份 - 像这样:2002-03 或 2007-11。它是一个字符串,但使用 to_datetime 命令导致它选择每个月的第一天(额外添加一天)。我将 to_datetime 与格式命令 '%Y%m' 一起使用。最终,我真的只想按年份和月份对这一列进行排序,然后从另一列中获得该月份和年份中所有内容的平均值。我想我仍然可以这样做,即使随机添加了“天”日期,但这似乎不是一种非常干净的方法。我做错了什么?

2 个答案:

答案 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']})

选项 1:日期为 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

选项 2:日期为整数

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 次循环)