将Pandas Series从Timedelta转换为微秒。

3
我有一个Pandas的Timedelta列,可以像这样创建:
import pandas as pd
tdelta_ser = pd.date_range(start='00:00:00', periods=3, freq='700ms') - pd.date_range(start='00:00:00', periods=3, freq='500ms') 
tdiff_df = pd.DataFrame(tdelta_ser, columns=['TimeDiff'])
print(tdiff_df)

                TimeDiff
0        0 days 00:00:00
1 0 days 00:00:00.200000
2 0 days 00:00:00.400000

寻找一个非常简洁的一行代码,可以将时间差转换为微秒,并且不对pandas Timedelta列的内部数据类型做任何假设,即使它是int64纳秒。
期望的结果:

               TimeDiff  DiffUsec
0        0 days 00:00:00         0
1 0 days 00:00:00.200000    200000
2 0 days 00:00:00.400000    400000


我尝试了几种方法。最简洁的方法如下,但它对Timedetla列的内部工作做了一些假设,即它是int64 nsecs,并且需要一个缩放因子1000来正确处理它。
tdiff_df['DiffUsec'] = tdiff_df['TimeDiff'].astype('int64') / 1000
print(tdiff_df)

                TimeDiff  DiffUsec
0        0 days 00:00:00       0.0
1 0 days 00:00:00.200000  200000.0
2 0 days 00:00:00.400000  400000.0

"这是一个很好的观点。请注意,它对Timedetla列的内部工作做出了int64 nsecs的假设。你可以通过tdiff_df['TimeDiff'].dt.unit来检查单位。我仍然会使用tdiff_df['TimeDiff'].astype(int).floordiv(1000),或者根据单位调整缩放因子。" - undefined
3个回答

1
另一种方法是使用total_seconds()方法,它将返回每个Timedelta的总持续时间(以秒为单位)。将结果乘以1,000,000,因为一秒钟有1,000,000微秒,这将给出所需的微秒值。这样可以处理毫秒的小数部分,正如你所指出的。
import pandas as pd

tdelta_ser = pd.date_range(start='00:00:00', periods=3, freq='700ms') - pd.date_range(start='00:00:00', periods=3, freq='500ms') 
tdiff_df = pd.DataFrame(tdelta_ser, columns=['TimeDiff'])

tdiff_df['DiffUsec'] = (tdiff_df['TimeDiff'].dt.total_seconds() * 1e6).astype('int64')
print(tdiff_df)


导致的结果是
                TimeDiff  DiffUsec
0        0 days 00:00:00         0
1 0 days 00:00:00.200000    200000
2 0 days 00:00:00.400000    400000

1
不错的方法。一行代码,不对pandas的时间缩放因子内部做任何假设。 - undefined

0
在尝试了一大堆之后,我找到了一颗被埋在Pandas文档中的隐藏宝石。
tdiff_df['DiffUsec'] = tdiff_df['TimeDiff'].dt.microseconds
print(tdiff_df)
                TimeDiff  DiffUsec
0        0 days 00:00:00         0
1 0 days 00:00:00.200000    200000
2 0 days 00:00:00.400000    400000

这只是微秒的组成部分,而不是完整的时间差作为微秒。 - undefined
感谢您指出这一点,@FObersteiner。我重新检查了一下,使用了1.4秒的时间差,结果是错误的。时间差为0天0小时0分钟0秒,差异为0微秒。 - undefined

0
由于您已经使用'ms'初始化了数据,您可以将其作为新列获取:
tdiff_df['TimeDiff'].dt.components.milliseconds

输出:

0      0
1    200
2    400
Name: milliseconds, dtype: int64

但是,如果你的timedelta有不同的初始化,比如纳秒或微秒,你可以通过dt.components属性获取这些值:
print(tdiff_df['TimeDiff'].dt.components)

输出:

  days  hours  minutes  seconds  milliseconds  microseconds  nanoseconds
0     0      0        0        0             0             0            0
1     0      0        0        0           200             0            0
2     0      0        0        0           400             0            0

很好的回答,@Suraj。dt.components的想法非常有用,毫秒可以很容易地转换为微秒,而不需要对pandas中的int64内部进行假设。但是,如果列中有任何毫秒的小数部分,它将无法正确转换为微秒。例如,200.3毫秒将通过这种方法产生200毫秒,并将其转换为微秒将得到200000,这是不正确的。 - undefined
哦,那么类似于 dt.components.milliseconds + dt.components.microseconds * 1e3 ... 这样的代码可能是一个解决方案,但是它会变得很冗长。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接