将Julian日期转换为数据框中的正常日期?

时间:2018-02-02 17:06:26

标签: python pandas datetime dataframe

我在带有Julian日期的pandas DF中有一个日期列。如何将这些Julian日期转换为mm-dd-yyyy格式。

示例数据

     ORG   CHAIN_NBR  SEQ_NBR     INT_STATUS  BLOCK_CODE_1  DATA_BLOCK_CODE_1
0   523         1        0          A             C             2012183
1   523         2        1          I             A             2013025
2   521         3        1          A             H             2007067
3   513         4        1          D             H             2001046
4   513         5        1          8             I             2006075

我使用的是jd2gcal功能,但它无效。我也试图编写这样的代码但没有用。

for i,row in amna.iterrows():
    amna['DATE_BLOCK_CODE_1'] = datetime.datetime.strptime(row['DATE_BLOCK_CODE_1'], '%Y%j')

所需的输出:

    ORG   CHAIN_NBR  SEQ_NBR     INT_STATUS  BLOCK_CODE_1  DATA_BLOCK_CODE_1
0   523         1        0          A             C             mm-dd-yyyy
1   523         2        1          I             A             mm-dd-yyyy
2   521         3        1          A             H             mm-dd-yyyy
3   513         4        1          D             H             mm-dd-yyyy
4   513         5        1          8             I             mm-dd-yyyy

请帮助我。

3 个答案:

答案 0 :(得分:2)

让我们试试这样的事情

df['New Date'] = (pd.to_datetime((df.DATA_BLOCK_CODE_1 // 1000).astype(str)) + 
                 pd.to_timedelta(df.DATA_BLOCK_CODE_1 % 1000, unit='D'))

print(df)

   ORG  CHAIN_NBR  SEQ_NBR INT_STATUS BLOCK_CODE_1  DATA_BLOCK_CODE_1   New Date
0  523          1        0          A            C            2012183 2012-07-02
1  523          2        1          I            A            2013025 2013-01-26
2  521          3        1          A            H            2007067 2007-03-09
3  513          4        1          D            H            2001046 2001-02-16
4  513          5        1          8            I            2006075 2006-03-17

答案 1 :(得分:2)

julian = df.DATA_BLOCK_CODE_1.str[4:].str.extract("([1-9][0-9]?[0-9]?)")    
df["DATA_BLOCK_CODE_1"] = df.DATA_BLOCK_CODE_1.str[:4] + "-" + julian
df['DATA_BLOCK_CODE_1'] = pd.to_datetime(df['DATA_BLOCK_CODE_1'], format='%Y-%j')

enter image description here

正则表达式要求数字开始任何数字但是0.(我假设DATA_BLOCK_CODE_1是字符串类型。)

答案 2 :(得分:0)

Pandas to_datetime function有一个origin参数,可将日期转换为julian:

amna['Date'] = pd.to_datetime(amna['DATA_BLOCK_CODE_1'], unit='D', origin='julian')

print(df)

   ORG  CHAIN_NBR  SEQ_NBR INT_STATUS BLOCK_CODE_1  DATA_BLOCK_CODE_1   Date
0  523          1        0          A            C            2012183 2012-07-02
1  523          2        1          I            A            2013025 2013-01-26
2  521          3        1          A            H            2007067 2007-03-09
3  513          4        1          D            H            2001046 2001-02-16
4  513          5        1          8            I            2006075 2006-03-17

请注意,您必须包含单位参数,并且必须将其设置为天('D')。