如何从timedelta中删除微秒

时间:2017-09-13 18:10:41

标签: python pandas timedelta

我想要基本上从pandas列截断微秒。我尝试了analyze_me['how_long_it_took_to_order'] = analyze_me['how_long_it_took_to_order'].apply(lambda x: x.replace(microsecond=0)之类的内容,但是出现了这个错误replace() takes no keyword arguments

例如:我希望00:19:58.582052成为00:19:58或00:19:58.58

enter image description here

3 个答案:

答案 0 :(得分:3)

我认为你需要将你的字符串转换为pd.to_timedelta的timedelta,然后利用优秀的dt访问器和基于字符串截断的floor方法。以下是数据的前两行。

df['how_long_it_took_to_order'] = pd.to_timedelta(df['how_long_it_took_to_order'])
df['how_long_it_took_to_order'].dt.floor('s')

0   00:19:58
1   00:25:09

可以到百分之一秒。

df['how_long_it_took_to_order'].dt.floor('10ms')

0   00:19:58.580000
1   00:25:09.100000

在这里,我创建了一系列timedeltas,然后使用dt访问器和floor方法截断到最接近的微秒。

d = pd.timedelta_range(0, periods=6, freq='644257us')
s = pd.Series(d)
s

0          00:00:00
1   00:00:00.644257
2   00:00:01.288514
3   00:00:01.932771
4   00:00:02.577028
5   00:00:03.221285
dtype: timedelta64[ns]

现在截断

s.dt.floor('s')

0   00:00:00
1   00:00:00
2   00:00:01
3   00:00:01
4   00:00:02
5   00:00:03
dtype: timedelta64[ns]

如果要截断到最接近的百分之一秒,请执行以下操作:

s.dt.floor('10ms')

0          00:00:00
1   00:00:00.640000
2   00:00:01.280000
3   00:00:01.930000
4   00:00:02.570000
5   00:00:03.220000
dtype: timedelta64[ns]

答案 1 :(得分:0)

您的how_long_it_took_to_order列似乎是字符串(object)dtype。

所以试试这个:

analyze_me['how_long_it_took_to_order'] = \
    analyze_me['how_long_it_took_to_order'].str.split('.').str[0]

或:

analyze_me['how_long_it_took_to_order'] = \
    analyze_me['how_long_it_took_to_order'].str.replace('(\.\d{2})\d+', r'\1')

表示“厘秒”,例如:00:19:58.58

答案 2 :(得分:0)

我需要一个简单的脚本,我没有使用 Pandas,并想出了一个简单的 hack,它应该适用于任何地方。

age = age - timedelta(microseconds=age.microseconds)

其中 age 是我的 timedelta 对象。

您不能直接修改 microseconds 对象的 timedelta 成员,因为它是不可变的,但当然,您可以将其替换为另一个不可变对象。