我有一个数据框,该数据框的类型为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
答案 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 的字符串。
那我的主张是:
上述所有步骤都具有专用功能。
要执行此任务,请定义一个函数:
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
答案 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