【问题标题】:Pandas : Add 2 time columns and create a new columnPandas:添加 2 个时间列并创建一个新列
【发布时间】:2020-09-21 23:56:08
【问题描述】:

我是 Pandas 的新手,想知道这是否可行。

我有两列,一列是纪元时间,另一列是毫秒数。我想创建一个以毫秒为单位的第三列,将这两个列用作以毫秒为单位的单个时间列,以便我可以轻松地在给定时间之间选择数据帧。有人可以帮我解决这个问题。

my_time         my_ms_counts
1500702208      1
1500702208      2
1500702208      3
1500702208      4
1500702208      5

有了这 2 个,我想要一个时间列。

【问题讨论】:

  • “单个时间列”是指日期时间值,第一行是2017-07-22 05:43:28.001?或者你想保持时间浮动?
  • 任何时间都可以。我尝试了您在下面描述的方法,它非常适合创建新列。但是我认为在选定的时间范围内获取数据帧很容易,但是在尝试时我总是得到空数据帧: self.df[(self.df['DateTimeTS'] >= datetime.strptime(start_timestamp_str, '%Y -%m-%d %H:%M:%S.%f'))] start_timestamp_str 看起来像 '2020-06-10 11:01:12.161'

标签: python pandas numpy


【解决方案1】:

pd.to_datetime 会将您的纪元时间转换为日期(为单位指定 seconds),然后使用pd.to_timedelta 添加毫秒。

df['datetime'] = (pd.to_datetime(df['my_time'], unit='s') 
                  + pd.to_timedelta(df['my_ms_counts'], unit='ms'))

#      my_time  my_ms_counts                datetime
#0  1500702208             1 2017-07-22 05:43:28.001
#1  1500702208             2 2017-07-22 05:43:28.002
#2  1500702208             3 2017-07-22 05:43:28.003
#3  1500702208             4 2017-07-22 05:43:28.004
#4  1500702208             5 2017-07-22 05:43:28.005

或者,您可以在转换为相似单位后合并两列。选择较小的单位 ms,以避免出现不完美的 float64 表示形式的问题。

df['full_time_ms'] = df['my_time']*1000 + df['my_ms_counts']

#      my_time  my_ms_counts                datetime   full_time_ms
#0  1500702208             1 2017-07-22 05:43:28.001  1500702208001
#1  1500702208             2 2017-07-22 05:43:28.002  1500702208002
#2  1500702208             3 2017-07-22 05:43:28.003  1500702208003
#3  1500702208             4 2017-07-22 05:43:28.004  1500702208004
#4  1500702208             5 2017-07-22 05:43:28.005  1500702208005

现在您可以转换指定 ms 的单列

pd.to_datetime(df['full_time_ms'], unit='ms')

#0   2017-07-22 05:43:28.001
#1   2017-07-22 05:43:28.002
#2   2017-07-22 05:43:28.003
#3   2017-07-22 05:43:28.004
#4   2017-07-22 05:43:28.005
#Name: full_time_ms, dtype: datetime64[ns]

【讨论】:

    【解决方案2】:

    您可以将两列相加为一个新列:

    df['new_column']=df['my_time']+df['my_ms_counts']
    

    如果您需要一个带有时间戳日期的新列,您可以这样做:

    df['date'] = pd.to_datetime(df['new_column'],unit='s')
    

    【讨论】:

      【解决方案3】:

      如果我理解正确,my_time 以秒为单位(从 UNIX 纪元开始),my_ms_counts 是您希望添加的毫秒数。

      如果您想要一个将两者加在一起的新列,以毫秒为单位(从纪元开始),您需要将 my_time 乘以 1000 并添加 my_ms_counts

      这样就可以了:

      df["ms"] = 1000 * df["my_time"] + df["my_ms_counts"]
      

      就像这样:

      df["ms"] = df.my_time.mul(1000).add(df.my_ms_counts)
      

      (如果你更喜欢方法链)

      但是,如果我是你,我会花一些时间研究 pandas 对日期时间操作的支持。对于您的应用程序,这将更容易使用。您可以首先将列解析为 pandas.Timestamp 对象。你想要的具体操作可以实现如下:

      df["new_dt_col"] = (
            pd.to_datetime(df.my_time, unit='s')
          + pd.to_timedelta(data.my_ms_counts, unit="ms")
      )
      

      注意这如何将my_time 列解析为Timestamp 对象,将my_ms_counts 解析为Timedelta 对象,这些对象可以添加到时间戳中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 2019-03-13
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多