将 Pandas 系列从 Timedelta 转换为微秒

Convert a Pandas Series from Timedelta to Microseconds

提问人:Gerard G 提问时间:10/7/2023 更新时间:10/10/2023 访问量:89

问:

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

寻找一个非常简洁的衬里,它将产生一个新列,将这个时间增量转换为微秒,而不假设熊猫时间增量列的内部 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 纳秒,并且需要 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
Python Pandas 序列时间 Timedelta

评论

0赞 FObersteiner 10/15/2023
“它假设 Timedetla 列的内部工作是 int64 nses” - 好点。请注意,您可以使用 检查设备。我仍然会使用 ,或根据单位调整比例因子。tdiff_df['TimeDiff'].dt.unittdiff_df['TimeDiff'].astype(int).floordiv(1000)

答:

0赞 Suraj Shourie 10/7/2023 #1

由于您已使用“ms”初始化了数据,因此可以将其作为新列获取:

tdiff_df['TimeDiff'].dt.components.milliseconds

输出:

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

但是,如果你的时间增量有不同的初始化,纳秒或微秒,你可以通过属性来获取它们: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

评论

0赞 Gerard G 10/7/2023
不错的答案@Suraj。这个想法非常有用,毫秒很容易转换为微秒,而无需对熊猫中的 int64 内部结构做出假设。但是,如果列中有任何毫秒的小数目,它将无法正确转换为微秒。例如,200.3 毫秒将产生 200 毫秒,而将其转换为微秒将产生 200000,这是不正确的。dt.components
0赞 Suraj Shourie 10/7/2023
哦,那么类似的东西可能是一个解决方案,但它变得很长dt.components.milliseconds + dt.components.microseconds * 1e3 ...
1赞 user3046211 10/7/2023 #2

另一种方法是使用该方法,该方法将返回每个 .将结果乘以 1,000,000,因为一秒钟有 1,000,000 微秒,这将为您提供所需的微秒值。正如您指出的那样,这应该处理几分之一毫秒。total_seconds()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'])

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赞 Gerard G 10/11/2023
不错的方法。一个没有关于熊猫时间比例因子内部假设的单衬里。
0赞 Gerard G 10/10/2023 #3

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

评论

0赞 FObersteiner 10/15/2023
这只是微秒分量,而不是作为微秒的完整时间增
0赞 Gerard G 10/17/2023
谢谢你指出这一点@FObersteiner。我用 1.4 秒的增量时间重新检查了它,它产生了不正确的结果 .''' TimeDiff DiffUsec 0 0 天 00:00:00 0 1 0 天 00:00:00.700000 700000 2 0 天 00:00:01.400000 400000'''