我正在尝试根据标准为Pandas数据帧中的各个行设置不同的时区。作为MWE,这是我尝试过的:
test = pd.DataFrame( data = pd.to_datetime(['2015-03-30 20:12:32','2015-03-12 00:11:11']) ,columns=['time'] )
test['new_col']=['new','old']
test.time=test.set_index('time').index.tz_localize('UTC')
test.loc[test.new_col=='new','time']=test[test.new_col=='new'].set_index('time').index.tz_convert('US/Pacific')
print test
输出:
time new_col
0 1427746352000000000 new
1 2015-03-12 00:11:11+00:00 old
如您所见,具有更新时区的行将转换为整数。如何正确执行此操作以使更新的条目成为日期时间?
答案 0 :(得分:1)
使用0.17.0rc2(0.17.0将于10月9日发布),可以执行此操作。
In [43]: test['new_col2'] = [Timestamp('2015-03-30 20:12:32',tz='US/Eastern'),Timestamp('2015-03-30 20:12:32',tz='US/Pacific')]
In [44]: test
Out[44]:
time new_col new_col2
0 2015-03-30 20:12:32+00:00 new 2015-03-30 20:12:32-04:00
1 2015-03-12 00:11:11+00:00 old 2015-03-30 20:12:32-07:00
In [45]: test.dtypes
Out[45]:
time datetime64[ns, UTC]
new_col object
new_col2 object
dtype: object
请注意混合时区在列中,使用强制object
dtype。所以它可以做到,但通常不推荐。您需要单独更改条目。
您几乎总是单个时区的单个dtyped列。
答案 1 :(得分:0)
在您添加指定要转换为时区的列之后,这是一种可行的解决方案。
utc_df = pd.DataFrame({"timestamp": [pd.Timestamp("2019-09-01 12:00:00+0000", tz="UTC"),
pd.Timestamp("2019-11-01 12:00:00+0000", tz="UTC")],
"timezone": ["Europe/Brussels", "Europe/London"]})
此示例仍然具有UTC时间,看起来像:
timestamp timezone
0 2019-09-01 12:00:00+00:00 Europe/Brussels
1 2019-11-01 12:00:00+00:00 Europe/London
然后我们按时区分组并应用转化。
def localize_time(df):
def convert_tz(tz_df):
return tz_df.set_index('timestamp').tz_convert(tz_df.timezone.values[0]).reset_index()
return df.groupby('timezone').apply(convert_tz).reset_index(drop=True)
localize_time(utc_df)
哪个返回:
timestamp timezone
0 2019-09-01 14:00:00+02:00 Europe/Brussels
1 2019-11-01 12:00:00+00:00 Europe/London
请注意,时间戳列的dtype
将更改为object
。
utc_df.dtypes
timestamp datetime64[ns, UTC]
timezone object
localize_time(utc_df).dtypes
timestamp object
timezone object
但是,只要您继续按时区分组,然后应用所需的功能(如此处显示的示例),您仍然可以访问此列的日期时间功能。