我的问题很简单。我有来自twitter的时间戳数据。每行都是一个用户,每列给出用户最后一次twitting。
time_0 time_1 time_2 time_3
21/03/2014 16:17 21/03/2014 15:40 21/03/2014 14:55 21/03/2014 12:50
21/03/2014 16:29 21/03/2014 16:26 21/03/2014 16:23 21/03/2014 16:21
04/07/2012 13:43 04/07/2012 13:37 04/07/2012 13:34 04/07/2012 13:29
19/03/2014 01:41 18/03/2014 01:19 17/03/2014 00:50 05/03/2014 22:30
我想做的是获得时差。对于每一列,我想将日期和时间替换为自上次发布以来的时间。例如,如果我的第一篇文章发生在晚上8点,而我的第二篇文章发布在8月45日,我希望在第一篇文章中获得“45分钟”。理想情况下,我的输出是这样的(差异以秒计算)
time_0 time_1 time_2 time_3
2220 2700 7500 43860
180 180 120 0
360 180 300 300
87720 88140 -4138800 5794500
60 0 0 0
74340 1800 0 540
我这样做:
df = pandas.read_csv("testtimedelta.csv",header=0,parse_dates=column_names)
df=df.dropna()#get rid of not complete rows
column_names=[]
for i in range(100):
column_names.append('time_'+str(i))
deltadatas=df[column_names]
for i in range(len(column_names)-1):
deltadatas[column_names[i]]=deltadatas[column_names[i]]-deltadatas[column_names[i+1]]/ np.timedelta64(1,'s')
这似乎是正确的,除了某些单元格它返回的结果与输入无关,例如400万秒,它应该是100万。有时它甚至会返回一个否定结果,正如您在上面的输出示例中所看到的那样。
有人能够解释发生了什么吗?建议一个更好的方法吗?
我使用的是numpy版本1.8.0和pandas版本0.13.0
编辑:错误的一个例子。state followers friends tweets_number time_0 source_0 time_1 source_1 time_2 source_2 time_3
Bot 3890 2222 1211 19/03/2014 01:41 twitterfeed 18/03/2014 01:19 twitterfeed 17/03/2014 00:50 twitterfeed 05/03/2014 22:30
在这个例子中,time2-time3会给我-47天,这是不可能的,如果我做@Jeff在下面建议的话,那就是47天。
非常感谢您的帮助!!
答案 0 :(得分:1)
Timedelta文档为here
In [29]: df1 = DataFrame(dict([ ("t{0}".format(i),date_range('20130101 01:0{0}'.format(i*3),periods=5,freq='T')) for i in range(2) ]))
In [30]: df2 = DataFrame(dict([ ("t{0}".format(i+3),date_range('20130101 01:0{0}'.format(i*5),periods=5,freq='T')) for i in range(2) ]))
In [31]: df = df1.join(df2)
In [32]: df
Out[32]:
t0 t1 t3 t4
0 2013-01-01 01:00:00 2013-01-01 01:03:00 2013-01-01 01:00:00 2013-01-01 01:05:00
1 2013-01-01 01:01:00 2013-01-01 01:04:00 2013-01-01 01:01:00 2013-01-01 01:06:00
2 2013-01-01 01:02:00 2013-01-01 01:05:00 2013-01-01 01:02:00 2013-01-01 01:07:00
3 2013-01-01 01:03:00 2013-01-01 01:06:00 2013-01-01 01:03:00 2013-01-01 01:08:00
4 2013-01-01 01:04:00 2013-01-01 01:07:00 2013-01-01 01:04:00 2013-01-01 01:09:00
[5 rows x 4 columns]
In [33]: (df.T-df.T.shift()).T.astype('timedelta64[s]')
Out[33]:
t0 t1 t3 t4
0 NaN 180 -180 300
1 NaN 180 -180 300
2 NaN 180 -180 300
3 NaN 180 -180 300
4 NaN 180 -180 300
[5 rows x 4 columns]
IIRC astype
需要pandas 0.13.1(但你可以随时df.apply(lambda x: x/np.timedelta64(1,'s'))