【问题标题】:How to merge month and year columns to get single mm-yyyy column?如何合并月份和年份列以获得单个 mm-yyyy 列?
【发布时间】:2018-12-08 06:09:01
【问题描述】:

我有一个这样的 df:

Sr.  lwd_month lwd_year
1     3        2015
2     6        2018
3.    9        2017
4.    NaN      NaN
5.    5        2015

如何合并这两列以获得如下数据框?:

Sr.  lwd_month   lwd_Year   MonthYear
1     3          2015    03-2015
2     6          2018     06-2018
3.    9          2017     09-2017
4.    NaN        NaN      NaT
5.    5          2015     05-2015
6.    3          NaN      NaT

谢谢

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    首先需要小写的列名yearmonth 和pandas 版本0.18.1+

    然后使用to_datetimeby multiple columnsstrftime 转换为字符串:

    df['MonthYear']=pd.to_datetime(df.assign(day=1)[['year','month','day']]).dt.strftime('%m-%Y')
    print (df)
       Sr.  month    year MonthYear
    0  1.0    3.0  2015.0   03-2015
    1  2.0    6.0  2018.0   06-2018
    2  3.0    9.0  2017.0   09-2017
    3  4.0    NaN     NaN       NaT
    4  5.0    5.0  2015.0   05-2015
    
    print (type(df.loc[0, 'MonthYear']))
    <class 'str'>
    

    类似的月份使用to_period:

    df['MonthYear'] = pd.to_datetime(df.assign(day=1)[['year','month','day']]).dt.to_period('m')
    print (df)
       Sr.  month    year MonthYear
    0  1.0    3.0  2015.0   2015-03
    1  2.0    6.0  2018.0   2018-06
    2  3.0    9.0  2017.0   2017-09
    3  4.0    NaN     NaN       NaT
    4  5.0    5.0  2015.0   2015-05
    
    print (type(df.loc[0, 'MonthYear']))
    <class 'pandas._libs.tslibs.period.Period'>
    

    【讨论】:

    • 第一种和第二种方法给出错误to assemble mappings requires at least that [year, month, day] be specified: [month,year] is missing
    • 我认为第三个不起作用,因为可能存在月份存在而年份为 NaN 的情况。
    • @AkshayNevrekar - 好的,试试df['MonthYear'] = pd.to_datetime(df.assign(Day=1)[['Year','Month','Day']].rename(columns=str.lower)).dt.strftime('%m-%Y')
    • 我的实际列名与给出的问题不同。如果我没记错的话,我必须用我正在做的YearMonth 替换它们。
    • 谢谢。更改列名在这里有所帮助。
    【解决方案2】:

    为什么不只是这样:

    df['MonthYear'] = pd.to_datetime(df[['Year', 'Month']].assign(Day=1)).dt.strftime('%m-%Y')
    print(df)
    

    输出:

       Sr.  Month    Year MonthYear
    0  1.0    3.0  2015.0   03-2015
    1  2.0    6.0  2018.0   06-2018
    2  3.0    9.0  2017.0   09-2017
    3  4.0    NaN     NaN       NaT
    4  5.0    5.0  2015.0   05-2015
    

    【讨论】:

    • @SreeramTP - 像我一样,所以同样的问题,我认为不是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多