【问题标题】:Timestamp, timedelta and conversion in PythonPython中的时间戳、时间增量和转换
【发布时间】:2021-01-10 12:49:49
【问题描述】:

我有一个数据框,其时间戳列的格式为: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 部分检索到一个系列或数据帧中吗?

【问题讨论】:

    标签: python datetime timestamp timedelta


    【解决方案1】:

    您的数据包含日期/时间信息(例如像“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
    

    【讨论】:

    • 非常感谢。它完美地工作。还有一个问题:如何将结果秒和毫秒值组合为 [SS.mmm]?再次感谢您。
    • @SaqibAlikhan:添加了一个选项。
    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 2013-02-08
    • 2020-06-15
    • 2011-08-23
    • 1970-01-01
    • 2019-02-03
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多