我有两个日期列。
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函数计算"不像以上那样。
答案 0 :(得分:3)
新soln: (请参阅数据部分进行设置)
提供engine='python'
,因为它目前设置为engine='numexpr'
。这是因为df.eval
从pd.eval
kwargs
df.eval("days=abs(ColA-ColB)", engine='python', inplace=True)
df
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)
df.assign(days=
df.apply(lambda x: abs(eval(repr(x['ColA'].date()-x['ColB'].date()))), axis=1))
答案 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)
输出:
答案 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
这假定ColA
和ColB
中的内容是datetime
个对象。如果不是,你应该按照MYGz的顺序首先转换它们。