【问题标题】:Convert Julian dates to normal dates in a dataframe?将儒略日期转换为数据框中的普通日期?
【发布时间】:2018-07-13 05:52:22
【问题描述】:

我在带有 Julian 日期的 pandas DF 中有一个日期列。如何将这些儒略日期转换为 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

请帮帮我。

【问题讨论】:

    标签: python pandas datetime dataframe


    【解决方案1】:

    让我们尝试这样的事情

    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
    

    【讨论】:

    • 你又快了 ;-)
    • @MaxU :) 谢谢。我想知道日期时间是否有比这更原生的东西。
    • @ScottBoston 这很好用,但我在 DATA_BLOCK_CODE_1 中也有 0,如果我有 0,那么它就不起作用....我该如何处理,再次感谢。
    【解决方案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')
    

    正则表达式要求数字以除 0 以外的任何数字开头。(我假设 DATA_BLOCK_CODE_1 是字符串类型。)

    【讨论】:

      【解决方案3】:

      Pandas to_datetime function 有一个 origin 参数,用于将朱利安转换为日期时间:

      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')。

      编辑 2020-06-27

      响应Sami Navesi's comment,如果DATA_BLOCK_CODE_1列是整数或字符串,则可以将年份拆分(转换为字符串)并单独转换儒略日as shown in this answer。此示例假定 DATA_BLOCK_CODE_1 是字符串。结果同上。

      amna['Date'] = [pd.to_datetime(e[:4]) + pd.to_timedelta(int(e[4:]) - 1, unit='D') for e in amna['DATA_BLOCK_CODE_1']]

      【讨论】:

      • 它会抛出一个错误:给定 'origin'='julian' 的不兼容 'arg' 类型!
      猜你喜欢
      • 2014-01-14
      • 2021-12-14
      • 1970-01-01
      • 2017-11-15
      • 2020-01-11
      • 2013-07-21
      • 2015-11-08
      • 2011-03-02
      相关资源
      最近更新 更多