Python 中的时间戳、时间增量和转换

Timestamp, timedelta and conversion in Python

我有一个数据框,它有一个时间戳列,格式为:YYYY-MM-DD HH:MM:SS:sss。示例如下:

0      2019-12-17 21:17:39.424
1      2019-12-17 21:17:41.065
2      2019-12-17 21:18:06.640
3      2019-12-17 21:18:07.229
4      2019-12-17 21:18:07.858
                 ...          
1072   2019-12-17 22:54:54.052
1073   2019-12-17 22:54:56.075
1074   2019-12-17 22:55:23.040
1075   2019-12-17 22:55:23.040
1076   2019-12-17 22:55:26.363
Name: time_stamp, Length: 1077, dtype: datetime64[ns]

我从一个 csv 文件中读取了数千行。我一直试图找到每个连续时间戳之间的时间间隔(timedelta)。由于每对连续对之间的差异不超过几秒,我只想检索该部分(丢弃数据、小时和分钟部分,无论如何都是 0。

我可以在循环内迭代地执行简单的减法,但我得到的结果是每次计算的字符串。示例如下:

> 0       0 days 00:00:03.988000
1       0 days 00:00:01.641000
2       0 days 00:00:25.575000
3       0 days 00:00:00.589000
4       0 days 00:00:00.629000
                 ...          
1072    0 days 00:00:36.084000
1073    0 days 00:00:02.023000
1074    0 days 00:00:26.965000
1075           0 days 00:00:00
1076    0 days 00:00:03.323000
Name: arr_time, Length: 1077, dtype: object

现在,如您所见,数据类型是字符串,这使我无法执行与 timedelta 或 datetime 数据类型相关的各种操作。我无法更改其数据类型。我对 datetimetimestamptimedelta 概念感到困惑,以至于我无法弄清楚是什么操作或每种情况都支持方法。

我可以提供原始的 csv 文件。

有人可以帮我检索每个 timedeltasecondsmilliseconds 部分吗] 将值转换为系列或数据框?

您的数据包含 date/time 信息(例如像“2019-12-17T21:17:39.424”这样的字符串)- 您将其解析为 datetime 例如喜欢

df['time_stamp'] = pd.to_datetime(df['time_stamp'])
# gives dtype: datetime64[ns]

此列 (pd.Series) 的单个元素将是 Timestamp。如果将两个时间戳相互减去,则会得到 timedelta:

# the difference between timestamps are timedeltas:
df['dt'] = df['time_stamp'].diff()
# df['dt']
# 0                      NaT
# 1   0 days 00:00:01.641000
# 2   0 days 00:00:25.575000
# 3   0 days 00:00:00.589000
# 4   0 days 00:00:00.629000
# Name: dt, dtype: timedelta64[ns]

现在您有了一个 dtype timedelta 列,您可以使用它来获取秒和毫秒:

# get the seconds fraction by flooring the total_seconds() of the timedelta
df['dt_s'] = np.floor(df['dt'].dt.total_seconds())
# df['dt_s']
# 0     NaN
# 1     1.0
# 2    25.0
# 3     0.0
# 4     0.0
# Name: dt_s, dtype: float64

# get the milliseconds by converting total_seconds() to milliseconds and taking modulo 1000:
df['dt_ms'] = (df['dt'].dt.total_seconds()*1000) % 1000
# df['dt_ms']
# 0      NaN
# 1    641.0
# 2    575.0
# 3    589.0
# 4    629.0
# Name: dt_ms, dtype: float64

如果需要,您可以将秒和毫秒组件格式化为字符串列:

# format to ss:fff output:
df['s_ms'] = (df['dt_s'].fillna(0).apply(lambda s: f'{int(s):02d}') + 
              ':' + 
              df['dt_ms'].fillna(0).apply(lambda s: f'{int(s):03d}'))
# df['s_ms'] 
# 0    00:000
# 1    01:641
# 2    25:575
# 3    00:589
# 4    00:629
# Name: s_ms, dtype: object