提问人:Gerard G 提问时间:10/7/2023 更新时间:10/10/2023 访问量:89
将 Pandas 系列从 Timedelta 转换为微秒
Convert a Pandas Series from Timedelta to Microseconds
问:
我有一个 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
答:
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'''
评论
tdiff_df['TimeDiff'].dt.unit
tdiff_df['TimeDiff'].astype(int).floordiv(1000)