将Pandas系列从Timedelta转换为微秒

bqucvtff  于 2023-10-14  发布在  其他
关注(0)|答案(3)|浏览(107)

我有一个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

寻找一个真正简洁的one liner,它将产生一个新的列,将时间增量转换为微秒,而不假设pandas Timedelta列的内部dtype是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
cwxwcias

cwxwcias1#

另一种方法是使用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
mwyxok5s

mwyxok5s2#

因为你已经用'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
kx7yvsdv

kx7yvsdv3#

经过一堆更多的尝试,这里有一个隐藏的宝石,被埋在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

相关问题