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 数据类型相关的各种操作。我无法更改其数据类型。我对 datetime、timestamp 和 timedelta 概念感到困惑,以至于我无法弄清楚是什么操作或每种情况都支持方法。
我可以提供原始的 csv 文件。
有人可以帮我检索每个 timedelta 的 seconds 和 milliseconds 部分吗] 将值转换为系列或数据框?
您的数据包含 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
我有一个数据框,它有一个时间戳列,格式为: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 数据类型相关的各种操作。我无法更改其数据类型。我对 datetime、timestamp 和 timedelta 概念感到困惑,以至于我无法弄清楚是什么操作或每种情况都支持方法。
我可以提供原始的 csv 文件。
有人可以帮我检索每个 timedelta 的 seconds 和 milliseconds 部分吗] 将值转换为系列或数据框?
您的数据包含 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