【问题标题】:Working with datetime in Python在 Python 中使用日期时间
【发布时间】:2015-07-04 17:01:09
【问题描述】:

我有一个格式如下的文件:

20150426010203 name1 
20150426010303 name2
20150426010307 name3
20150426010409 name1
20150426010503 name4
20150426010510 name1

我有兴趣在列表中查找 name1 出现之间的时间差,然后计算此类出现的频率(例如,delta time = 1s 出现 20 time,delta time = 30s 出现 1 time 等)。第二个问题是如何找到每分钟/小时/天的事件数。

我发现所有的时差是通过使用

pd.to_datetime(pd.Series([time]))

将每个字符串转换为日期时间格式并将所有值放在名为“times”的列表中。然后我遍历列表:

new=[x - times[i - 1] for i, x in enumerate(times)][1:]

结果列表是这样的:

dtype: timedelta64[ns], 0   00:00:50
dtype: timedelta64[ns], 0   00:00:10
dtype: timedelta64[ns], 0   00:00:51
dtype: timedelta64[ns], 0   00:00:09
dtype: timedelta64[ns], 0   00:00:50
dtype: timedelta64[ns], 0   00:00:11

任何进一步计算频率的尝试都会导致“TypeError:'Series'对象是可变的,因此它们不能被散列”错误。而且我不确定在哪里可以找到如何计算每分钟或任何其他时间单位的事件数。

显然,我对 Python 中的 datetime 没有太多经验,所以任何指针都将不胜感激。

【问题讨论】:

  • 每个问题确实应该是 1 个问题
  • 显然,您已经知道要使用 to_datetime ... 您应该将您的列更改为该值。听起来您想重新采样(使用 aggfunc=len)...但不清楚,因为您没有包含预期的结果。

标签: python datetime pandas


【解决方案1】:

使用重采样和求和来获取每个时间段的事件数 - 示例如下

我收集您想要个人的间隔(名称 1:第 1 到第 2 个事件间隔;然后是他/她的第 2 到第 3 个事件间隔)。您需要按名称分组,然后区分每个组的时间。在您的数据集中,只有 name1 有多个事件,而以人为中心的区间需要两个事件。

又快又脏……

# --- get your data into a DataFrame so I can play with it ...
#     first, put the data in a multi-line string (I would read it from a file
#     if I had it in a file - but for my purposes a string will do).
data = """
time name
20150426010203 name1 
20150426010303 name2
20150426010307 name3
20150426010409 name1
20150426010503 name4
20150426010510 name1"""
#    second I will use StringIO and pandas.read_csv to pretend I am
#    reading it from a file.
from StringIO import StringIO # import from io in Python 3
df = pd.read_csv(StringIO(data), header=0, index_col=0, sep='\s+')
#    third, because pandas did not recognise the date-time format
#    of the column I made the index, I will force the string to be
#    converted to a pandas Timestamp come DatetimeIndex.
df.index = pd.to_datetime(df.index, format='%Y%m%d%H%M%S')

# number of events per minute
df['event'] = 1 # we will sum this to get events per time-period
dfepm = df.resample('1min', how=sum)

# number of events per hour
dfeph = df.resample('1h', how=sum)

# time differences by name
del df['event'] # we don't need this anymore
df['time'] = df.index
df['time_diff_by_name'] = df.groupby('name')['time'].diff()

【讨论】:

  • 感谢您的回答!您能否在前几行代码中添加一个解释,以便我知道您做了什么?使用字符串非常慢,所以我试图对列表做同样的事情,但需要知道你在前几行代码中做了什么。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
相关资源
最近更新 更多