Pandas 读取格式 %D:%H:%M:%S python
Pandas read format %D:%H:%M:%S with python
目前我正在读取带有电影时间戳的数据帧 00(天):00(小时时钟在 24 到天):00(分钟):00(秒)
pandas
读取时间格式 HH:MM:SS 和 YYYY:MM:DD HH:MM:SS 很好。
虽然有没有办法让 pandas 读取持续时间,例如 DD:HH:MM:SS.
或者使用 timedelta 如何将 DD 放入数据框中的 HH,以便 pandas 可以使其成为“1 天 HH:MM:SS”,例如
数据样本
00:00:00:00
00:07:33:57
02:07:02:13
00:00:13:11
00:00:10:11
00:00:00:00
00:06:20:06
01:12:13:25
最后一个样本的预期输出
36:13:25
谢谢
单独转换天数,添加到时间和最后调用自定义函数:
def f(x):
ts = x.total_seconds()
hours, remainder = divmod(ts, 3600)
minutes, seconds = divmod(remainder, 60)
return ('{}:{:02d}:{:02d}').format(int(hours), int(minutes), int(seconds))
d = pd.to_timedelta(df['col'].str[:2].astype(int), unit='d')
td = pd.to_timedelta(df['col'].str[3:])
df['col'] = d.add(td).apply(f)
print (df)
col
0 0:00:00
1 7:33:57
2 55:02:13
3 0:13:11
4 0:10:11
5 0:00:00
6 6:20:06
7 36:13:25
如果你想要 timedelta 对象,一个简单的方法是将第一个冒号替换为 days
:
df['timedelta'] = pd.to_timedelta(df['col'].str.replace(':', 'days ', n=1))
输出:
col timedelta
0 00:00:00:00 0 days 00:00:00
1 00:07:33:57 0 days 07:33:57
2 02:07:02:13 2 days 07:02:13
3 00:00:13:11 0 days 00:13:11
4 00:00:10:11 0 days 00:10:11
5 00:00:00:00 0 days 00:00:00
6 00:06:20:06 0 days 06:20:06
7 01:12:13:25 1 days 12:13:25
>>> df.dtypes
col object
timedelta timedelta64[ns]
dtype: object
从那里开始,将日期和时间组合为字符串也相对容易:
c = df['timedelta'].dt.components
df['str_format'] = ((c['hours']+c['days']*24).astype(str)
+df['col'].str.split('(?=:)', n=2).str[-1]).str.zfill(8)
输出:
col timedelta str_format
0 00:00:00:00 0 days 00:00:00 00:00:00
1 00:07:33:57 0 days 07:33:57 07:33:57
2 02:07:02:13 2 days 07:02:13 55:02:13
3 00:00:13:11 0 days 00:13:11 00:13:11
4 00:00:10:11 0 days 00:10:11 00:10:11
5 00:00:00:00 0 days 00:00:00 00:00:00
6 00:06:20:06 0 days 06:20:06 06:20:06
7 01:12:13:25 1 days 12:13:25 36:13:25
目前我正在读取带有电影时间戳的数据帧 00(天):00(小时时钟在 24 到天):00(分钟):00(秒)
pandas
读取时间格式 HH:MM:SS 和 YYYY:MM:DD HH:MM:SS 很好。
虽然有没有办法让 pandas 读取持续时间,例如 DD:HH:MM:SS.
或者使用 timedelta 如何将 DD 放入数据框中的 HH,以便 pandas 可以使其成为“1 天 HH:MM:SS”,例如
数据样本
00:00:00:00
00:07:33:57
02:07:02:13
00:00:13:11
00:00:10:11
00:00:00:00
00:06:20:06
01:12:13:25
最后一个样本的预期输出
36:13:25
谢谢
单独转换天数,添加到时间和最后调用自定义函数:
def f(x):
ts = x.total_seconds()
hours, remainder = divmod(ts, 3600)
minutes, seconds = divmod(remainder, 60)
return ('{}:{:02d}:{:02d}').format(int(hours), int(minutes), int(seconds))
d = pd.to_timedelta(df['col'].str[:2].astype(int), unit='d')
td = pd.to_timedelta(df['col'].str[3:])
df['col'] = d.add(td).apply(f)
print (df)
col
0 0:00:00
1 7:33:57
2 55:02:13
3 0:13:11
4 0:10:11
5 0:00:00
6 6:20:06
7 36:13:25
如果你想要 timedelta 对象,一个简单的方法是将第一个冒号替换为 days
:
df['timedelta'] = pd.to_timedelta(df['col'].str.replace(':', 'days ', n=1))
输出:
col timedelta
0 00:00:00:00 0 days 00:00:00
1 00:07:33:57 0 days 07:33:57
2 02:07:02:13 2 days 07:02:13
3 00:00:13:11 0 days 00:13:11
4 00:00:10:11 0 days 00:10:11
5 00:00:00:00 0 days 00:00:00
6 00:06:20:06 0 days 06:20:06
7 01:12:13:25 1 days 12:13:25
>>> df.dtypes
col object
timedelta timedelta64[ns]
dtype: object
从那里开始,将日期和时间组合为字符串也相对容易:
c = df['timedelta'].dt.components
df['str_format'] = ((c['hours']+c['days']*24).astype(str)
+df['col'].str.split('(?=:)', n=2).str[-1]).str.zfill(8)
输出:
col timedelta str_format
0 00:00:00:00 0 days 00:00:00 00:00:00
1 00:07:33:57 0 days 07:33:57 07:33:57
2 02:07:02:13 2 days 07:02:13 55:02:13
3 00:00:13:11 0 days 00:13:11 00:13:11
4 00:00:10:11 0 days 00:10:11 00:10:11
5 00:00:00:00 0 days 00:00:00 00:00:00
6 00:06:20:06 0 days 06:20:06 06:20:06
7 01:12:13:25 1 days 12:13:25 36:13:25