说我在熊猫队有一个时间戳:
Timestamp('2014-08-07 11:01:02')
我想知道在一小时内多少毫秒。我怎么能在熊猫中做到这一点?
在上面的示例中,我将查找以下之间的差异:
Timestamp('2014-08-07 11:01:02')
Timestamp('2014-08-07 11:00:00')
如果我有一个系列保存如下所示的时间戳,我该怎么做?
timestamp
1071 2014-08-07 11:01:02
3291 2014-08-07 11:01:00
3355 2014-08-07 05:01:00
3518 2014-08-07 05:01:03
4207 2014-08-07 13:01:03
5039 2014-08-07 18:01:04
5063 2014-08-07 23:01:03
6926 2014-08-07 06:01:02
6965 2014-08-07 06:01:02
7107 2014-08-07 05:01:01
Name: events_source_timestamp, dtype: datetime64[ns]
试试@ Jeff的回答。以下作品:
In [210]: temp_df = m*(df.astype('i8')/m).astype('i8')
Out[210]:
A_timestamp B_timestamp
1 1407405600000000000 1407405600000000000
2 1407445200000000000 1407445200000000000
3 1407434400000000000 1407434400000000000
4 1407445200000000000 1407445200000000000
5 1407438000000000000 1407438000000000000
6 1407402000000000000 1407402000000000000
7 1407420000000000000 1407420000000000000
8 1407438000000000000 1407438000000000000
9 1407438000000000000 1407438000000000000
10 1407420000000000000 1407420000000000000
11 1407420000000000000 1407420000000000000
12 1407441600000000000 1407441600000000000
13 1407409200000000000 1407409200000000000
14 1407391200000000000 1407391200000000000
15 1407409200000000000 1407409200000000000
16 1407420000000000000 1407420000000000000
但是
pd.DatetimeIndex(temp_df)
失败了:
/Users/josh/anaconda/envs/py3k/lib/python3.3/site-packages/pandas/tseries/tools.py in parse_time_string(arg, freq, dayfirst, yearfirst)
472 except Exception as e:
473 # TODO: allow raise of errors within instead
--> 474 raise DateParseError(e)
475
476 if parsed is None:
DateParseError: unknown string format
答案 0 :(得分:3)
以下是执行此操作的规范方法,请参阅有关Timedelta处理方法的文档here。
In [16]: s = Series([Timestamp('20140804 11:01:12'),Timestamp('20140804 11:00:00')])
In [17]: s
Out[17]:
0 2014-08-04 11:01:12
1 2014-08-04 11:00:00
dtype: datetime64[ns]
In [18]: (s-Timestamp('20140804 11:00:00')).astype('timedelta64[ms]')
Out[18]:
0 72000
1 0
dtype: float64
In [19]: (s-Timestamp('20140804 11:00:00')) / np.timedelta64(1,'ms')
Out[19]:
0 72000
1 0
dtype: float64
这是一种将系列赛绕到最近的小时的方法,虽然它有点hacky atm, 并且需要作为正确的DatetimeIndex方法实现,请参阅here
In [169]: m = int(1e9*60*60)
In [170]: rounded = Series(pd.DatetimeIndex(m*(s.astype('i8')/m).astype('i8')))
In [171]: rounded
Out[171]:
0 2014-08-04 11:00:00
1 2014-08-04 11:00:00
dtype: datetime64[ns]
In [172]: (s-rounded).astype('timedelta64[ms]')
Out[172]:
0 72000
1 0
dtype: float64
答案 1 :(得分:1)
如果index
是DatetimeIndex
:
hour_as_integer = int(np.timedelta64(1, 'h') / np.timedelta64(1, 'ns'))
ms_as_integer = int(np.timedelta64(1, 'ms') / np.timedelta64(1, 'ns'))
ts.asi8 % hour_as_integer // ms_as_integer
属性asi8
将索引转换为其内部表示,即微秒unix时间戳的64位整数。然后除以10 ** 6 * 3600
的剩余部分(以微秒为单位),结果除以10 ** 3
得到毫秒。
对于单个pd.Timestamp
对象,您可以使用
ts.asm8.astype("int64") % hour_as_integer // ms_as_integer
对于Series
你可以做
series.astype("int64") % hour_as_integer // ms_as_integer
最后一个我得到了
1071 62000 3291 60000 3355 60000 3518 63000 4207 63000 5039 64000 5063 63000 6926 62000 6965 62000 7107 61000 Name: events_source_timestamp, dtype: int64
您的数据。
但请注意,如果您有非整数时区偏移,则所有这些都将失败。