Python-从不同的年份和月份排列的单个列中提取年份和月份

时间:2019-11-24 01:00:37

标签: python pandas

我想从包含不同年份和月份安排的日期列创建两个“年份”和“月份”列。有些是YY-Mmm,有些是Mmm-YY。

import pandas as pd

dataSet = {
    "Date": ["18-Jan", "18-Jan", "18-Feb", "18-Feb", "Oct-17", "Oct-17"],
    "Quantity": [3476, 20, 789, 409, 81, 640],
}

df = pd.DataFrame(dataSet, columns=["Date", "Quantity"])

我的尝试如下:

Date1 = []
Date2 = []
for dt in df.Date:
    Date1.append(dt.split("-")[0])
    Date2.append(dt.split("-")[1])

Year = []
try:
    for yr in Date1:
        Year.append(int(yr.Date1))
except:
    for yr in Date2:
        Year.append(int(yr.Date2))

3 个答案:

答案 0 :(得分:2)

您可以使用extract数据框字符串方法来拆分日期字符串。由于年份可以在月份之前或之后,因此我们可以有所创新,并且在任一位置都有一个Year1列和一个Year2列。然后使用np.where从其他所有年份列中创建一个Year列提取。

例如:

import numpy as np

split_dates = df["Date"].str.extract(r"(?P<Year1>\d+)?-?(?P<Month>\w+)-?(?P<Year2>\d+)?")

split_dates["Year"] = np.where(
    split_dates["Year1"].notna(),
    split_dates["Year1"],
    split_dates["Year2"],
)

split_dates = split_dates[["Year", "Month"]]

包含split_dates的结果:

  Year Month
0   18   Jan
1   18   Jan
2   18   Feb
3   18   Feb
4   17   Oct
5   17   Oct

然后,您可以使用pd.merge与原始数据框合并,如下所示:

pd.merge(df, split_dates, how="inner", left_index=True, right_index=True)

哪种产量:

     Date  Quantity Year Month
0  18-Jan      3476   18   Jan
1  18-Jan        20   18   Jan
2  18-Feb       789   18   Feb
3  18-Feb       409   18   Feb
4  Oct-17        81   17   Oct
5  Oct-17       640   17   Oct

答案 1 :(得分:1)

感谢您的帮助。我设法将其与到目前为止所学到的内容一起使用,例如for循环,if-else和split()以及另一位专家的帮助。

# Split the Date column and store it in an array
dA = []
for dP in df.Date:
    dA.append(dP.split("-"))
# Append month and year to respective lists based on if conditions
Month = []
Year = []
for moYr in dA:
    if len(moYr[0]) == 2:
        Month.append(moYr[1])
        Year.append(moYr[0])
    else:
        Month.append(moYr[0])
        Year.append(moYr[1])

这花了我几个小时!

答案 2 :(得分:0)

尝试在日期列上使用Python datetime strptime(<date>, "%y-%b"),将其转换为Python datetime

from datetime import datetime

def parse_dt(x):
    try:
        return datetime.strptime(x, "%y-%b")
    except:
        return datetime.strptime(x, "%b-%y")

df['timestamp'] = df['Date'].apply(parse_dt)

df
     Date  Quantity  timestamp
0  18-Jan      3476 2018-01-01
1  18-Jan        20 2018-01-01
2  18-Feb       789 2018-02-01
3  18-Feb       409 2018-02-01
4  Oct-17        81 2017-10-01
5  Oct-17       640 2017-10-01

然后,您可以只使用.month .year 属性,或者如果您更喜欢月份作为缩写形式,请使用Python datetime.strftime('%b')

df['year'] = df.timestamp.apply(lambda x: x.year)
df['month'] = df.timestamp.apply(lambda x: x.strftime('%b'))

df
     Date  Quantity  timestamp  year month
0  18-Jan      3476 2018-01-01  2018   Jan
1  18-Jan        20 2018-01-01  2018   Jan
2  18-Feb       789 2018-02-01  2018   Feb
3  18-Feb       409 2018-02-01  2018   Feb
4  Oct-17        81 2017-10-01  2017   Oct
5  Oct-17       640 2017-10-01  2017   Oct