【问题标题】:Why is Python pandas assigning arbitrary time information to datetime object?为什么 Python pandas 将任意时间信息分配给 datetime 对象?
【发布时间】:2020-02-19 19:43:43
【问题描述】:

Python pandas (0.24.1) 正在向我的 datetime 对象添加看似任意数量的小时、分钟和秒。这似乎是出乎意料的默认行为;我希望时间组件默认为午夜(00:00:00)。这是一个错误吗?

import pandas as pd

df = pd.DataFrame( {'yr': [2019, 2019],
                    'mo': [9, 9],
                    'dy': [25, 26]}     )

df['dtime'] = ( pd.to_datetime(df['yr'],format='%Y')
               +pd.to_timedelta(df['mo']-1,unit='M')
               +pd.to_timedelta(df['dy']-1,unit='d') )


print('pandas version == '+pd.__version__)
df

################################################
OUTPUT:
################################################

pandas version == 0.24.1
yr  mo  dy  dtime
0   2019    9   25  2019-09-25 11:52:48
1   2019    9   26  2019-09-26 11:52:48

【问题讨论】:

    标签: python pandas datetime timedelta


    【解决方案1】:

    问题在于转换月份,这里使用'rounded' 年(因为闰年)除以12 得到'rounded' 月份:

    print (pd.to_timedelta(365.2425, unit='d') / 12)
    30 days 10:29:06
    
    print (pd.to_timedelta(1, unit='M'))
    30 days 10:29:06
    
    print (pd.to_timedelta(df['mo']-1,unit='M'))
    0   243 days 11:52:48
    1   243 days 11:52:48
    Name: mo, dtype: timedelta64[ns]
    

    更好的解决方案是将to_datetimeyearmonhtday 列一起使用,并在必要时使用list(d.values()) 按子集对其进行过滤(如果实际数据中有其他列):

    d = {'yr':'year', 'mo':'month', 'dy':'day'}
    df['dtime'] = pd.to_datetime(df.rename(columns=d)[list(d.values())])
    
    print (df)
         yr  mo  dy      dtime
    0  2019   9  25 2019-09-25
    1  2019   9  26 2019-09-26
    

    【讨论】:

      【解决方案2】:

      为了补充 Jezrael 上面指出的 timedelta 问题的详细信息,月份转换的问题如下:Pandas timedelta 将月份定义为一年的 1/12,即基于闰年逻辑的 365.2425 天.

      243 天 11:52:48 是 21037968 秒。

      >>> 243*60*60*24+11*60*60+52*60+48
      21037968
      

      一些维度分析证实这是一年的 8/12,即 365.2425 天。

      >>> 21037968/((8/12)*365.2425*60*60*24)
      1.0
      

      如上所述,使用 to_datetime 来避免这种情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2014-07-08
        • 2018-04-24
        相关资源
        最近更新 更多