使用 Python 将日期时间戳转换为 unix
Converting DateTime stamps into unix with Python
我似乎无法将时间戳转换为 unix 时间戳格式,并假设我遗漏了一些要点。寻求帮助。
我在 df 中有一列是日期时间对象,格式如下:
YYYY-MM-DD HH:MM:SS 并且我需要一个带有 unix 戳记的新列。
我将 csv 导入 python 中:
gps = filepath here
dateparse= lambda x: pd.datetime.strptime(x, '%Y%m%d %H:%M:%S')
gps_dat = pd.read_csv(gps, parse_dates=['date_stamp'],date_parser=dateparse)
每当我尝试将此列更改为 unix 标记时,我都会收到有关错误格式的错误消息,或者 "datetime.datetime" 没有属性 "datetime",其中:
gps_dat['unix']=datetime.datetime(gps_dat['date_stamp'])
我应该使用
calendar.timegm(tuple)
我还在学习中,所以非常感谢任何帮助!
编辑:我从未使用过Pandas,但看起来这是你应该调用的函数:
gps_dat['unix'] = gps_dat.apply(lambda row: time.mktime(row['date_stamp'].timetuple()), axis=col_number)
其中 col_number
是您的 date_stamp
列的索引(假设它被正确解析为 datetime
)。
原回答(当时不知道有Pandas参与):
替换那个
gps_dat['unix']=datetime.datetime(gps_dat['date_stamp'])
符合
gps_dat['unix'] = time.mktime(gps_dat['date_stamp'].timetuple())
并添加
import time
到你的进口。请注意 some considerations apply to time zones,因此根据您的要求,您可能需要添加一些逻辑,例如转换为 UTC。
您可以通过 list
理解使用更快的解决方案:
print gps_dat
nam code date1 date_stamp
0 a 1 1/1 2012-10-08 18:15:05
1 b 3 3/4 2012-10-08 18:15:05
gps_dat['unix'] = [t.value // 10 ** 9 for t in gps_dat['date_stamp']]
print gps_dat
nam code date1 date_stamp unix
0 a 1 1/1 2012-10-08 18:15:05 1349720105
1 b 3 3/4 2012-10-08 18:15:05 1349720105
时间:
In [46]: %timeit gps_dat['date_stamp'].astype(np.int64) // 10**9
1000 loops, best of 3: 204 µs per loop
In [47]: %timeit [t.value // 10 ** 9 for t in gps_dat['date_stamp']]
The slowest run took 4.99 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 24.2 µs per loop
更新: 如果要将日期时间列 转换为 UNIX 时间戳:
gps_dat['unix']=gps_dat['date_stamp'].astype(np.int64) // 10**9
注意:但必须是datetime
类型,不是string/object
旧答案: 解析 从 UNIX 时间戳到日期时间
尝试像这样更改您的解析器函数:
dateparse= lambda x: pd.to_datetime(x, unit='s')
这将指示to_datetime()您正在使用 UNIX 时间戳格式
我似乎无法将时间戳转换为 unix 时间戳格式,并假设我遗漏了一些要点。寻求帮助。
我在 df 中有一列是日期时间对象,格式如下: YYYY-MM-DD HH:MM:SS 并且我需要一个带有 unix 戳记的新列。
我将 csv 导入 python 中:
gps = filepath here
dateparse= lambda x: pd.datetime.strptime(x, '%Y%m%d %H:%M:%S')
gps_dat = pd.read_csv(gps, parse_dates=['date_stamp'],date_parser=dateparse)
每当我尝试将此列更改为 unix 标记时,我都会收到有关错误格式的错误消息,或者 "datetime.datetime" 没有属性 "datetime",其中:
gps_dat['unix']=datetime.datetime(gps_dat['date_stamp'])
我应该使用
calendar.timegm(tuple)
我还在学习中,所以非常感谢任何帮助!
编辑:我从未使用过Pandas,但看起来这是你应该调用的函数:
gps_dat['unix'] = gps_dat.apply(lambda row: time.mktime(row['date_stamp'].timetuple()), axis=col_number)
其中 col_number
是您的 date_stamp
列的索引(假设它被正确解析为 datetime
)。
原回答(当时不知道有Pandas参与):
替换那个
gps_dat['unix']=datetime.datetime(gps_dat['date_stamp'])
符合
gps_dat['unix'] = time.mktime(gps_dat['date_stamp'].timetuple())
并添加
import time
到你的进口。请注意 some considerations apply to time zones,因此根据您的要求,您可能需要添加一些逻辑,例如转换为 UTC。
您可以通过 list
理解使用更快的解决方案:
print gps_dat
nam code date1 date_stamp
0 a 1 1/1 2012-10-08 18:15:05
1 b 3 3/4 2012-10-08 18:15:05
gps_dat['unix'] = [t.value // 10 ** 9 for t in gps_dat['date_stamp']]
print gps_dat
nam code date1 date_stamp unix
0 a 1 1/1 2012-10-08 18:15:05 1349720105
1 b 3 3/4 2012-10-08 18:15:05 1349720105
时间:
In [46]: %timeit gps_dat['date_stamp'].astype(np.int64) // 10**9
1000 loops, best of 3: 204 µs per loop
In [47]: %timeit [t.value // 10 ** 9 for t in gps_dat['date_stamp']]
The slowest run took 4.99 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 24.2 µs per loop
更新: 如果要将日期时间列 转换为 UNIX 时间戳:
gps_dat['unix']=gps_dat['date_stamp'].astype(np.int64) // 10**9
注意:但必须是datetime
类型,不是string/object
旧答案: 解析 从 UNIX 时间戳到日期时间
尝试像这样更改您的解析器函数:
dateparse= lambda x: pd.to_datetime(x, unit='s')
这将指示to_datetime()您正在使用 UNIX 时间戳格式