我需要在一段时间内制作事件的直方图。我的数据集以ex格式给出了每个事件的时间。 2013-09-03 17:34:04,如何将其转换为我能够在Python的直方图中绘制的内容? 我知道如何使用datetime和time命令进行相反的操作。
顺便说一下,我的数据集包含1.500.000以上的数据点,所以请只提供可以通过循环或类似的东西自动化的解决方案;)
答案 0 :(得分:0)
使用time.strptime()
将本地时间字符串转换为time.struct_time
,然后转换为time.mktime()
,这会将time.struct_time
转换为自1970-01-01以来的秒数00:00:00,UTC。
#! /usr/bin/env python
import time
def timestr_to_secs(timestr):
fmt = '%Y-%m-%d %H:%M:%S'
time_struct = time.strptime(timestr, fmt)
secs = time.mktime(time_struct)
return int(secs)
timestrs = [
'2013-09-03 17:34:04',
'2013-09-03 17:34:05',
'2013-09-03 17:35:04',
'1970-01-01 00:00:00'
]
for ts in timestrs:
print ts,timestr_to_secs(ts)
我在时区+10,上面代码给出的输出是:
2013-09-03 17:34:04 1378193644
2013-09-03 17:34:05 1378193645
2013-09-03 17:35:04 1378193704
1970-01-01 00:00:00 -36000
当然,出于直方图制作的目的,您可能希望从这些数字中减去方便的基准时间。
这是一个更好的版本,受到J. F. Sebastian评论的启发。
#! /usr/bin/env python
import time
import calendar
def timestr_to_secs(timestr):
fmt = '%Y-%m-%d %H:%M:%S'
time_struct = time.strptime(timestr, fmt)
secs = calendar.timegm(time_struct)
return secs
timestrs = [
'2013-09-03 17:34:04',
'2013-09-03 17:34:05',
'2013-09-03 17:35:04',
'1970-01-01 00:00:00'
]
for ts in timestrs:
print ts,timestr_to_secs(ts)
<强>输出强>
2013-09-03 17:34:04 1378229644
2013-09-03 17:34:05 1378229645
2013-09-03 17:35:04 1378229704
1970-01-01 00:00:00 0
每当我想到使用localtime时可能出现的问题时,我都会想起这个多年前发生在我朋友身上的经典例子。
作为FidoNet C_ECHO的定期撰稿人的程序员已经为啤酒厂编写了过程控制代码。不幸的是,他的代码使用了localtime()而不是gmtime(),当啤酒厂计算机在夏令时结束时自动调整时钟时会产生意想不到的后果。那天早上,当地时间凌晨2点发生了两次。所以他的程序重复了它已经在凌晨2点第一次滚动的过程,这是为了开始用啤酒原料填充相当大的桶。你可以想象,啤酒厂的地板很乱。 :)
答案 1 :(得分:0)
要处理数百万点的时间序列,您可以尝试pandas:
#!/usr/bin/env python
from io import StringIO
import matplotlib.pyplot as plt # $ pip install matplotlib
import pandas as pd
csv_file = StringIO(u"""time,A,B
2013-09-03 17:34:04,1,2
2013-09-03 17:34:05,3,4
2013-09-03 17:34:10,4,5
""")
df = pd.read_csv(csv_file, parse_dates=True, index_col='time')
df = df.cumsum()
df.plot()
plt.show()