获取自午夜以来在数据框中花费的时间

时间:2019-02-20 13:10:10

标签: pandas python-datetime timedelta

我有一个数据框,该数据框的类型为Timestamp。我想查找自午夜以来经过的时间(以秒为单位)作为新列。如何以简单的方式做到这一点?

例如: 输入:

samples['time']
2018-10-01 00:00:01.000000000
2018-10-01 00:00:12.000000000

type(samples['time'].iloc[0])

<class 'pandas._libs.tslib.Timestamp'>

输出:

samples['time_elapsed']
1
12

6 个答案:

答案 0 :(得分:0)

在Pandas中执行此操作非常简单!

midnight = pd.Timestamp('2018-10-01 00:00:00')
print(pd.Timestamp('2018-10-01 00:00:01.000000000') - midnight).seconds
>
1

通过扩展,我们可以在熊猫系列中使用apply

samples = pd.DataFrame(['2018-10-01 00:00:01.000000000', '2018-10-01 00:00:12.000000000'], columns=['time'])
samples.time = pd.to_datetime(samples.time)
midnight = pd.Timestamp('2018-10-01 00:00:00')
samples['time_elapsed'] = samples['time'].apply(lambda x: (x - midnight).seconds)
samples
>
        time    time_elapsed
0   2018-10-01 00:00:01     1
1   2018-10-01 00:00:12     12

请注意,答案here使用另一种方法:将时间戳与其本身转换为日期进行比较。这会将所有时间数据清零,因此相当于当天的午夜。这种方法可能会更有效。

答案 1 :(得分:0)

请注意,每一行中的日期部分可能是其他日期(不是一个日期部分) 和同一天),因此您不能输入任何“基准日期”(午夜) 对于整个DataFrame,可以在其他解决方案之一中看到。

我的意图也不是“污染”源DataFrame 与任何中间列,例如时间(实际上是日期和时间) 转换为“ true” DateTime 的字符串。

那我的主张是:

  • 将DateTime字符串转换为DateTime,
  • 参与其中的时间
  • 计算小时/分钟/秒的秒数 部分。

上述所有步骤都具有专用功能。

要执行此任务,请定义一个函数:

def secSinceNoon(datTimStr):
    tt = pd.to_datetime(datTimStr).time()
    return tt.hour * 3600 + tt.minute * 60 + tt.second

然后致电:

samples['Secs'] = samples.time.apply(secSinceNoon)

对于源数据:

samples = pd.DataFrame(data=[
    [ '2018-10-01 00:00:01' ], [ '2018-10-01 00:00:12' ],
    [ '2018-11-02 01:01:10' ], [ '2018-11-04 03:02:15' ] ],
    columns = ['time']);

打印结果时,您将看到:

                  time   Secs
0  2018-10-01 00:00:01      1
1  2018-10-01 00:00:12     12
2  2018-11-02 01:01:10   3670
3  2018-11-04 03:02:15  10935

答案 2 :(得分:0)

当前答案过于复杂或专业。

samples = pd.DataFrame(data=['2018-10-01 00:00:01', '2018-10-01 00:00:12'], columns=['time'], dtype='datetime64[ns]')

samples['time_elapsed'] = ((samples['time'] - samples['time'].dt.normalize()) / pd.Timedelta('1 second')).astype(int)

print(samples)
                 time  time_elapsed
0 2018-10-01 00:00:01             1
1 2018-10-01 00:00:12            12
  • normalize()从日期时间中删除时间部分(将时钟移回到午夜)。
  • pd.Timedelta('1 s')设置度量单位,即timedelta中的秒数。
  • .astype(int)将十进制的秒数强制转换为int。如果需要,请使用圆形功能。

答案 3 :(得分:0)

我在自己的一个项目中遇到了同样的问题,这就是我的解决方法(假设您的time列已转换为Timestamp):

(samples['time'] - samples['time'].dt.normalize()) / pd.Timedelta(seconds=1)

这种方法的优点在于,您可以更改最后一部分以获取秒,分钟,小时或天数:

... / pd.Timedelta(seconds=1) # seconds elapsed
... / pd.Timedelta(minutes=1) # minutes elapsed
... / pd.Timedelta(hours=1)   # hours elapsed
... / pd.Timedelta(days=1)    # days elapsed

答案 4 :(得分:0)

datetime = samples['time']

(datetime - datetime.dt.normalize()).dt.total_seconds()

答案 5 :(得分:-1)

我们可以做到:

    samples['time'].dt.hour * 3600 + 
    samples['time'].dt.minute * 60 + 
    samples['time'].dt.second