我刚刚开始学习python,并试图让它为我的工作做一些有用的事情。
我的目标是从excel文件中读取一个包含以下格式数据的表,并对其进行一些计算: 这是员工工作天数的服务记录:
import pandas
db=pandas.read_excel('earnedleaves.xls')
from datetime import datetime
def Calc_Days_Worked(dtentry, dtexit):
if type(dtexit) is pandas._libs.tslib.NaTType:
dtexit = pandas.Timestamp.now.to_pydatetime()
return (dtexit-dtentry.to_pydatetime()).days
return (dtexit.to_pydatetime()-dtentry.to_pydatetime()).days
for (dtfrom, dtto) in zip(db['Day from'], db['Day to']):
print (Calc_Days_Worked(dtfrom, dtto))
在最后一行中,未给出Day to,并将其视为当前日期。
我写了以下内容:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-52-b44dc7b7c4c2> in <module>()
2 print (dtfrom, dtto)
3 # print (type(dtfrom))
----> 4 print (Calc_Days_Worked(dtfrom, dtto))
<ipython-input-51-0e4a2d290dce> in Calc_Days_Worked(dtentry, dtexit)
2 def Calc_Days_Worked(dtentry, dtexit):
3 if type(dtexit) is pandas._libs.tslib.NaTType:
----> 4 dtexit = pandas.Timestamp.now.to_pydatetime()
5 return (dtexit-dtentry.to_pydatetime()).days
6
AttributeError: 'cython_function_or_method' object has no attribute 'to_pydatetime'
除了遇到NaT类型的最后一行外,它的工作情况非常好。我无法使用此值减去天数,因为它返回错误。显然我没有使用正确的数据类型。我已经在datetime和pandas Timestamp中尝试了各种类型,但是无法正确地将当前日期转换为与pandas._libs.tslib.Timestamp兼容的类型
输出:
{{1}}
答案 0 :(得分:2)
我认为需要pandas功能,因为同时使用NaN
和NaT
值 - 首先转换列to_datetime
然后获取days
:
db['diff'] = (pd.to_datetime(db['Day to']) - pd.to_datetime(db['Day from'])).dt.days
print (db)
Day from Day to diff
0 01/09/12 31/08/13 600.0
1 04/07/15 10/11/15 187.0
2 11/11/17 NaN NaN
如果以后需要处理日期时间:
db['Day to'] = pd.to_datetime(db['Day to'])
db['Day from'] = pd.to_datetime(db['Day from'])
db['diff'] = (db['Day to'] - db['Day from']).dt.days
print (db)
Day from Day to diff
0 2012-01-09 2013-08-31 600.0
1 2015-04-07 2015-10-11 187.0
2 2017-11-11 NaT NaN