【问题标题】:Convert Days Int64 to Date将天数 Int64 转换为日期
【发布时间】:2018-09-25 05:20:35
【问题描述】:

我需要将以下数据框(天)转换为实际日期。当 (days=0) 这是基准年 01/01/1960。您能否协助将天数列(字面意思是从 1960 年 1 月 1 日开始的天数)转换回日期?

df=pd.DataFrame([-730,-640,-549,457,-365,275,-184,-92,0,91,182,274,366],columns=['days'])
df['base_year']=datetime.date(1960,1,1)

【问题讨论】:

    标签: python pandas date datetime timedelta


    【解决方案1】:

    回想起来,MaxU 的答案更好。以下内容可能对旧版 Pandas 有用。

    有几种方法可以做到这一点。一种是使用datetime.timedelta 和列表理解:

    from datetime import timedelta
    import pandas as pd
    
    >>> [pd.to_datetime('01/01/1960') + timedelta(d) for d in [-730,-640,-549,457,-365,275,-184,-92,0,91,182,274,366]]
    [Timestamp('1958-01-01 00:00:00'),
     Timestamp('1958-04-01 00:00:00'),
     Timestamp('1958-07-01 00:00:00'),
     Timestamp('1961-04-02 00:00:00'),
     Timestamp('1959-01-01 00:00:00'),
     Timestamp('1960-10-02 00:00:00'),
     Timestamp('1959-07-01 00:00:00'),
     Timestamp('1959-10-01 00:00:00'),
     Timestamp('1960-01-01 00:00:00'),
     Timestamp('1960-04-01 00:00:00'),
     Timestamp('1960-07-01 00:00:00'),
     Timestamp('1960-10-01 00:00:00'),
     Timestamp('1961-01-01 00:00:00')]
    

    所以你可以使用

    >>> DataFrame([pd.to_datetime('01/01/1960') + timedelta(d) for d in [-730,-640,-549,457,-365,275,-184,-92,0,91,182,274,366]],columns=['days'])
        days
    0   1958-01-01
    1   1958-04-01
    2   1958-07-01
    3   1961-04-02
    4   1959-01-01
    5   1960-10-02
    6   1959-07-01
    7   1959-10-01
    8   1960-01-01
    9   1960-04-01
    10  1960-07-01
    11  1960-10-01
    12  1961-01-01
    

    【讨论】:

    • Ami,如果我已经在数据框中有这个,它会返回一个错误。 'year_quarter' 是从 '01/01/1960' 开始的天数,“year_quarter' 的数据类型是 int64。quarterly_data['date']=pd.to_datetime('01/01/1960')+datetime.timedelta(days= Quarterly_data['year_quarter'])
    • @Kyle 那样的话,你可以使用df.days.apply(lambda d: timedelta(days=d) + pd.to_datetime('01/01/1960')),但是MaxU的回答更好。
    【解决方案2】:

    您可以使用相对较新的功能(在 Pandas 0.20.0 中添加) - origin of pd.to_datetime()

    In [44]: df['date'] = pd.to_datetime(df['days'], origin='1960-01-01', unit='D')
    
    In [45]: df
    Out[45]:
        days       date
    0   -730 1958-01-01
    1   -640 1958-04-01
    2   -549 1958-07-01
    3    457 1961-04-02
    4   -365 1959-01-01
    5    275 1960-10-02
    6   -184 1959-07-01
    7    -92 1959-10-01
    8      0 1960-01-01
    9     91 1960-04-01
    10   182 1960-07-01
    11   274 1960-10-01
    12   366 1961-01-01
    

    来自docs

    origin:标量,默认为‘unix’

    定义参考日期。数值将被解析为 自此参考日期以来的单位数(由单位定义)。

    如果是'unix'(或POSIX)时间;原点设置为 1970-01-01。如果是“朱利安”, 单位必须为“D”,并且原点设置为儒略历的开头。

    儒略日编号 0 分配给从 1 月中午开始的那一天

    1,公元前 4713 年。如果 Timestamp 可转换,则 origin 设置为 Timestamp 按原产地标识。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 2019-12-11
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多