如何使用pandas的eval函数计算两个日期列之间的天数?

时间:2017-02-01 09:15:42

标签: python pandas

我有两个日期列。

df =    ColA         ColB
       31-1-17      01-2-17

exp = 'days = ColA - ColB'

df.eval(exp,inplace=True)

预期产出:

ColA         ColB      days
31-1-17      01-2-17    1 days

我可以像这样计算

df['days'] = df['ColA'] - df[ColB]

但我想用" eval函数计算"不像以上那样。

3 个答案:

答案 0 :(得分:3)

新soln: (请参阅数据部分进行设置)

提供engine='python',因为它目前设置为engine='numexpr'。这是因为df.evalpd.eval

继承了它kwargs
df.eval("days=abs(ColA-ColB)", engine='python', inplace=True)
df

enter image description here

old soln:

以下是一种方法:(在v'0.19.2'中测试)

1)首先确保两列都是datetime64[ns]类型。如果没有,请单独使用pd.to_datetime或在apply的帮助下对其进行输入。在这里,我在阅读时将它们解析为dates以避免执行此步骤。

2)使用内置函数repr(),将它们转换为日期时间对象的官方表示,稍后可以由eval()函数理解。 (正如repr(datetime.date.today())给出'datetime.date(2017, 2, 1)'

3)通过访问.date属性来减去它们,然后在几天后输出模数。

<强> 数据:

txt = StringIO(
    """
ColA         ColB
31-1-17      01-2-17
    """)
df = pd.read_csv(txt, delim_whitespace=True, parse_dates=['ColA', 'ColB'], dayfirst=True)

enter image description here

df.assign(days=
          df.apply(lambda x: abs(eval(repr(x['ColA'].date()-x['ColB'].date()))), axis=1))

enter image description here

答案 1 :(得分:0)

你可以尝试这样:

# import pandas as pd
#df = pd.read_clipboard()
df = df.apply(lambda x: pd.to_datetime(x, dayfirst=True ), axis=1)
df.assign(days = lambda x: df.ColB - df.ColA)

输出:

enter image description here

答案 2 :(得分:0)

使用eval

import pandas as pd

>>> df = pd.DataFrame()
>>> df['ColA'] = pd.date_range('01/01/2010', periods=5, freq='M')
>>> df['ColB'] = pd.date_range('01/01/2011', periods=5)
>>> df['days'] = df.eval('ColA-ColB')
>>> df
        ColA       ColB      days
0 2010-01-31 2011-01-01 -335 days
1 2010-02-28 2011-01-02 -308 days
2 2010-03-31 2011-01-03 -278 days
3 2010-04-30 2011-01-04 -249 days
4 2010-05-31 2011-01-05 -219 days

这假定ColAColB中的内容是datetime个对象。如果不是,你应该按照MYGz的顺序首先转换它们。