时间戳偏移(日,小时,分钟等)

时间:2014-08-22 13:47:17

标签: python datetime pandas

说我在熊猫队有一个时间戳:

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

2 个答案:

答案 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)

如果indexDatetimeIndex

,则可以执行此操作
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

您的数据。

但请注意,如果您有非整数时区偏移,则所有这些都将失败。