如何在熊猫中显示正确的日期世纪?

时间:2019-04-18 05:46:39

标签: python pandas date

我的其中一列中包含以下数据:

onDestroy()

我想将其转换为数据类型列。 我尝试了以下操作:

public abstract class BasicActivity extends AppCompatActivity {

    private BroadcastReceiver broadcastReceiver;
    private IntentFilter filter;
    private static final String TAG = "BasicActivity";

    /**********************************************************************
    *                   Boilerplate code
    **********************************************************************/

    @Override
    public void onCreate(Bundle sis){
        super.onCreate(sis);
        broadcastReceiver = getBroadcastReceiver();
        filter = getFilter();
    }

    @Override
    public void onStart(){
        super.onStart();
        register();
    }

    @Override
    public void onStop(){
        super.onStop();
        unregister();
    }

    private void register(){
        registerReceiver(broadcastReceiver,filter);
    }

    private void unregister(){
        unregisterReceiver(broadcastReceiver);
    }

    /**********************************************************************
    *                   Abstract methods
    **********************************************************************/

    public abstract BroadcastReceiver getBroadcastReceiver();

    public abstract IntentFilter getFilter();

}

如何获取日期为1968-01-06而不是2068-01-06?

5 个答案:

答案 0 :(得分:5)

在这种特定于 的情况下,我将使用以下方式:

pd.to_datetime(df['DOB'].str[:-2] + '19' + df['DOB'].str[-2:])

请注意,如果您在1999年之后拥有DOB,这将中断!

输出:

0   1984-01-01
1   1985-07-31
2   1985-08-24
3   1993-12-30
4   1977-09-12
5   1990-08-09
6   1988-01-06
7   1989-04-10
8   1991-11-15
9   1968-01-06
dtype: datetime64[ns]

答案 1 :(得分:4)

您可以先转换为日期时间,如果年份大于或等于2020,然后减去DateOffset创建的100年:

df['DOB'] = pd.to_datetime(df['DOB'], format='%d-%m-%y')
df.loc[df['DOB'].dt.year >= 2020, 'DOB'] -= pd.DateOffset(years=100)
#same like
#mask = df['DOB'].dt.year >= 2020
#df.loc[mask, 'DOB'] = df.loc[mask, 'DOB'] - pd.DateOffset(years=100)
print (df)
         DOB
0 1984-01-01
1 1985-07-31
2 1985-08-24
3 1993-12-30
4 1977-12-09
5 1990-09-08
6 1988-06-01
7 1989-10-04
8 1991-11-15
9 1968-06-01

或者您可以将1920加到Series.str.replace的年份,并根据条件设置numpy.where的估价。

通知:00的解决方案也可以使用2000年,直到2020为止。

s1 = df['DOB'].str.replace(r'-(\d+)$', r'-19\1')
s2 = df['DOB'].str.replace(r'-(\d+)$', r'-20\1')
mask = df['DOB'].str[-2:].astype(int) <= 20
df['DOB'] = pd.to_datetime(np.where(mask, s2, s1))

print (df)
         DOB
0 1984-01-01
1 1985-07-31
2 1985-08-24
3 1993-12-30
4 1977-09-12
5 1990-08-09
6 1988-01-06
7 1989-04-10
8 1991-11-15
9 1968-01-06

如果所有年份都低于2000

s1 = df['DOB'].str.replace(r'-(\d+)$', r'-19\1')
df['DOB'] = pd.to_datetime(s1, format='%d-%m-%Y')
print (df)
         DOB
0 1984-01-01
1 1985-07-31
2 1985-08-24
3 1993-12-30
4 1977-12-09
5 1990-09-08
6 1988-06-01
7 1989-10-04
8 1991-11-15
9 1968-06-01

答案 2 :(得分:1)

另一种解决方案是将DOB视为日期,并且仅在将来(即在“现在”之后)才将其返回到上个世纪。示例:

from datetime import datetime, date

df=pd.DataFrame.from_dict({'DOB':['01-06-68','01-06-08']})
df['DOB'] = df['DOB'].apply(lambda x: datetime.strptime(x,'%d-%m-%y'))
df['DOB'] = df['DOB'].apply(lambda x: x if x<datetime.now() else date(x.year-100,x.month,x.day))

答案 3 :(得分:0)

通常(在不确定的情况下)最好明确指定年份:

&nbsp;

我使用以下数据框运行了此

pd.to_datetime(data['Date.of.Birth'].apply(lambda x: '-'.join(x.split('-')[:-1] + ['19' + x.split('-')[2]])))

答案 4 :(得分:0)

如果开头只有1920,则可以使用以下代码,例如:

df['DOB'] = pd.to_datetime(df['DOB'].str.replace('20([^20]*)$', '19'))

如果其他任何地方都没有20

df['DOB'] = pd.to_datetime(df['DOB'].str.replace('20', '19'))

现在:

print(df['DOB'])

是:

0   1984-01-01
1   1985-07-31
2   1985-08-24
3   1993-12-30
4   1977-09-12
5   1990-08-09
6   1988-01-06
7   1989-04-10
8   1991-11-15
9   1968-01-06
dtype: datetime64[ns]