使用 pandas 将年月列干净地组合为单个日期列
Posted
技术标签:
【中文标题】使用 pandas 将年月列干净地组合为单个日期列【英文标题】:Cleanly combine year and month columns to single date column with pandas 【发布时间】:2018-06-26 13:25:36 【问题描述】:我的数据如下所示:
+----+------+-------+
| ID | YEAR | MONTH |
+----+------+-------+
| A | 2017 | 1 |
| B | 2017 | 2 |
| C | 2017 | 3 |
| D | 2017 | 4 |
| E | 2017 | 5 |
| F | 2017 | 6 |
+----+------+-------+
我想添加一个名为DATE
的新列,它存储一个由YEAR
和MONTH
列的日期对象组成的新列。像这样的:
+----+------+-------+------------+
| ID | YEAR | MONTH | DATE |
+----+------+-------+------------+
| A | 2017 | 1 | 2017-01-01 |
| B | 2017 | 2 | 2017-02-01 |
| C | 2017 | 3 | 2017-03-01 |
| D | 2017 | 4 | 2017-04-01 |
| E | 2017 | 5 | 2017-05-01 |
| F | 2017 | 6 | 2017-06-01 |
+----+------+-------+------------+
我使用以下代码来创建列,但想知道是否有更简洁的“Pythonic”单行。类似于df['DATE']=date(df.year, df.month, 1)
的东西。
import pandas as pd
from datetime import date
ID = ['A', 'B', 'C', 'D', 'E', 'F']
YEAR = [2017, 2017, 2017, 2017, 2017, 2017]
MONTH = [1, 2, 3, 4, 5, 6]
df = pd.DataFrame('ID': ID, 'YEAR': YEAR, 'MONTH': MONTH)
DATE = []
for y, m in zip(df.YEAR, df.MONTH):
DATE.append(date(y, m, 1))
df['DATE'] = DATE
【问题讨论】:
【参考方案1】:选项 1
将具有 3 列的数据帧切片 - YEAR
、MONTH
和 DAY
传递给 pd.to_datetime
。
df['DATE'] = pd.to_datetime(df[['YEAR', 'MONTH']].assign(DAY=1))
df
ID MONTH YEAR DATE
0 A 1 2017 2017-01-01
1 B 2 2017 2017-02-01
2 C 3 2017 2017-03-01
3 D 4 2017 2017-04-01
4 E 5 2017 2017-05-01
5 F 6 2017 2017-06-01
选项 2
字符串连接,用pd.to_datetime
.
pd.to_datetime(df.YEAR.astype(str) + '/' + df.MONTH.astype(str) + '/01')
0 2017-01-01
1 2017-02-01
2 2017-03-01
3 2017-04-01
4 2017-05-01
5 2017-06-01
dtype: datetime64[ns]
【讨论】:
请注意,year
、month
和 day
是 pandas 查找的特殊字符串。如果您的列被命名为其他名称(例如,start_year
),您必须在转换之前重命名它们(df.rename(columns='start_year': 'year')
)。
第二种方法没有任何异常。以上是关于使用 pandas 将年月列干净地组合为单个日期列的主要内容,如果未能解决你的问题,请参考以下文章
pandas将dataframe中的年月日数据列合并成完整日期字符串并使用to_datetime将字符串格式转化为日期格式
pandas的string日期列转化为timestamp(时间戳)
pandas使用dt.year(month/day/hour/minute/second)函数抽取dataframe日期数据列对应的年月日时分秒信息