[英]Why is Python pandas assigning arbitrary time information to datetime object?
Python pandas (0.24.1) 正在向我的日期时间对象添加看似任意数量的小时、分钟和秒。 这似乎是出乎意料的默认行为; 我希望时间组件默认为午夜(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
问题在于转换月份,这里使用'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_datetime
与year
、 monht
和day
列一起使用,并在必要时使用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
为了补充 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 来避免这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.