【问题标题】:How to convert epoch time to GMT + 7 time in pandas dataframe?如何在熊猫数据框中将纪元时间转换为 GMT + 7 时间?
【发布时间】:2021-09-13 07:20:19
【问题描述】:

我有一个 pandas 数据框,该数据框有一列 created_date 是纪元格式。我想使用如下所示的过滤条件。

数据框示例

    created_time   updated_time       sys_time  last_action_time account_id  \
0   1624473000000  1624459148023  1624459148023                 0        812   
1   1624471920000  1624448094358  1624448094358                 0        812   
2   1624469400000  1624455267579  1624455267579                 0        812   
3   1624466580000  1624466620020  1624466590321                 0        812   
4   1624466529000  1624466610222  1624466540086                 0        812   
5   1624466501000  1624466610270  1624466510212                 0        812   
6   1624466461000  1624466620149  1624466469825                 0        812   
7   1624466443000  1624466446558  1624466446558                 0        812   
8   1624466435000  1624466460213  1624466460213                 0        812 

daily_data_df = [(data_df['created_time'] >= start_date_int) & (data_df['created_time'] < end_date_int)

在哪里,
start_date_int & end_date_int 是 GMT+7 时区
created_time 是纪元格式

请帮助我进行转换。

【问题讨论】:

  • 您需要过滤方面的帮助吗?如果是,请同时提供 start_date_int & end_date_int 的示例数据

标签: python pandas dataframe data-conversion


【解决方案1】:

首先:从“created_time”列中删除最后 3 位数字,似乎纪元长度只有 9-10,而您有 13:

df['created_time'] = df['created_time'].astype(str).apply(lambda x: x[:-3])

第二:从 Unix 纪元转换为日期时间:

df['created_time'] = pd.to_datetime(df['created_time'], unit = 's')

第三:过滤日期范围(低于示例日期范围):

start_date_int = '2021-06-23 18:12:00'
end_date_int   = '2021-06-23 18:30:00'

df_filterd = df[(df['created_time'] >= start_date_int) &\
                (df['created_time'] <  end_date_int)]

*过滤器的替代方法:

df_filterd = df[df['created_time'].between(start_date_int , end_date_int)]

【讨论】:

    【解决方案2】:

    您可以使用pd.to_datetime()dt.tz_convert() 将纪元时间转换为GMT+7,如下所示:

    data_df['created_GMT+7'] = pd.to_datetime(data_df['created_time'], unit='ms', utc=True).dt.tz_convert('Etc/GMT+7')
    

    结果:

    print(data_df['created_GMT+7'])
    
    0   2021-06-23 11:30:00-07:00
    1   2021-06-23 11:12:00-07:00
    2   2021-06-23 10:30:00-07:00
    3   2021-06-23 09:43:00-07:00
    4   2021-06-23 09:42:09-07:00
    5   2021-06-23 09:41:41-07:00
    6   2021-06-23 09:41:01-07:00
    7   2021-06-23 09:40:43-07:00
    8   2021-06-23 09:40:35-07:00
    Name: created_GMT+7, dtype: datetime64[ns, Etc/GMT+7]
    

    然后,按如下方式过滤行:

    start_date_int = 1624466460500
    end_date_int = 1624469402000
    
    mask = data_df['created_GMT+7'].between(pd.Timestamp(start_date_int, unit='ms', tz='Etc/GMT+7'), pd.Timestamp(end_date_int, unit='ms', tz='Etc/GMT+7'))
    daily_data_df = data_df.loc[mask]
    

    或者,

    start_date_int = 1624466460500
    end_date_int = 1624469402000
    
    mask = ((data_df['created_GMT+7'] - pd.Timestamp("1970-01-01", tz='Etc/GMT+7')) // pd.Timedelta('1ms')).between(start_date_int, end_date_int)
    daily_data_df = data_df.loc[mask]
    

    结果: (使用上面的示例start_date_intend_date_int

    print(daily_data_df)
    
        created_time   updated_time       sys_time  last_action_time  account_id             created_GMT+7
    2  1624469400000  1624455267579  1624455267579                 0         812 2021-06-23 10:30:00-07:00
    3  1624466580000  1624466620020  1624466590321                 0         812 2021-06-23 09:43:00-07:00
    4  1624466529000  1624466610222  1624466540086                 0         812 2021-06-23 09:42:09-07:00
    5  1624466501000  1624466610270  1624466510212                 0         812 2021-06-23 09:41:41-07:00
    6  1624466461000  1624466620149  1624466469825                 0         812 2021-06-23 09:41:01-07:00
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2021-03-25
      • 2021-05-02
      • 2021-08-25
      • 2014-05-19
      • 1970-01-01
      • 2018-10-14
      • 2012-08-12
      • 2019-04-09
      相关资源
      最近更新 更多