【问题标题】:Rounding to nearest day in Python在 Python 中四舍五入到最近的一天
【发布时间】:2018-07-09 15:09:06
【问题描述】:

所以我从 SQL 下载了一个表,现在我正在对它执行操作。其中两列是 Start_Date 和 Maturity_Date,我希望将其中两列相减,然后除以另一列。我已经想出了如何使用以下代码减去它们:

df['START_DATE']=pd.to_datetime(df['START_DATE'])
df['MATURITY_DATE']=pd.to_datetime(df['MATURITY_DATE'])

df['c']=df['MATURITY_DATE']-df['START_DATE']
df['d']=df['c'].div(df['TERM'], axis=0)

但是,当我将日期时间中的“c”除以 int 形式的“术语”时,我的新 df['d'] 看起来像“60 天 4:00:00”。我不希望它是日期,但我希望将 df['d'] 四舍五入到最接近的整数,并且我能够对其执行操作,就好像它是一个整数一样。本质上,如何将 df['d'] 转换为最接近的整数?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用pandas.Series.dt.round,指定您希望它是最近的一天。

    (df['MATURITY_DATE']-df['START_DATE']).div(df.TERM).dt.round('1d')
    

    如果您需要数字而不是 timedelta,请使用 numpy 进行转换:

    (df['MATURITY_DATE']-df['START_DATE']).div(df.TERM).dt.round('1d')/np.timedelta64(1, 'D')
    

    样本数据

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'START_DATE': [pd.to_datetime('2017-01-01'), pd.to_datetime('2017-01-01')],
                      'MATURITY_DATE': [pd.to_datetime('2017-01-06 11:00:00'), pd.to_datetime('2017-01-06 13:00:00')],
                      'TERM': [3,2]})
    
    #  START_DATE       MATURITY_DATE  TERM
    #0 2017-01-01 2017-01-06 11:00:00     3
    #1 2017-01-01 2017-01-06 13:00:00     2
    

    代码:

    (df['MATURITY_DATE']-df['START_DATE']).div(df.TERM).dt.round('1d')
    #0   2 days
    #1   3 days
    #dtype: timedelta64[ns]
    
    (df['MATURITY_DATE']-df['START_DATE']).div(df.TERM).dt.round('1d')/np.timedelta64(1, 'D')
    #0    2.0
    #1    3.0
    #dtype: float64
    

    【讨论】:

    • 我尝试了这两个 pandas.series.dt.round 来代替 df['START_DATE']=pd.to_datetime(df['START_DATE']) df['MATURITY_DATE']=pd.to_datetime(df['MATURITY_DATE']) df['c']=df['MATURITY_DATE']-df['START_DATE'] df['d']=df['c'].div(df['TERM'], axis=0) 并得到“不支持的操作数类型 -: 'str' 和 'str'”
    • @throway172 你能打印df.dtypes。在您尝试减去它们之前,您的列似乎没有转换为 datetime64
    • @throway172 你不应该在整个代码块中使用我的代码。您需要保留前两部分,它们使用pd.to_datetime 进行转换,但是您可以将定义df['c']df['d'] 的位置替换为上面的单行。所以你会有df['d'] = (df['MATURITY_DATE']-df['START_DATE']).div(df.TERM).dt.round('1d')/np.timedelta64(1, 'D')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多