Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多列时区上的日期时间函数_Python_Pandas_Datetime - Fatal编程技术网

Python 多列时区上的日期时间函数

Python 多列时区上的日期时间函数,python,pandas,datetime,Python,Pandas,Datetime,我有一个数据帧z2,列为utc_时间和时区。我想创建一个新列,该列采用UTC历元时间,并根据列timezone中的时区返回日期时间。我还使用pytz的函数timezone。我想在合理的运行时间内将下面的函数应用于整个数据帧(几百万长)。我尝试过使用assign和apply,但它给了我一个“Series”对象没有属性“upper”错误 datetime.fromtimestamp((z2['utc_time'][0])/1000, timezone(str(z2['timezone'][0])))

我有一个数据帧z2,列为utc_时间和时区。我想创建一个新列,该列采用UTC历元时间,并根据列timezone中的时区返回日期时间。我还使用pytz的函数timezone。我想在合理的运行时间内将下面的函数应用于整个数据帧(几百万长)。我尝试过使用assign和apply,但它给了我一个“Series”对象没有属性“upper”错误

datetime.fromtimestamp((z2['utc_time'][0])/1000, timezone(str(z2['timezone'][0]))).strftime('%Y-%m-%d %H:%M:%S')

因为你只有4个时区,你应该可以循环这些时区。您可以使用
.loc
选择相应的行并进行本地化。例:

import pandas as pd
# example df:
df = pd.DataFrame({'UTCtime': ['2020-03-01T12:00:00', '2020-07-01T12:00:00'],
                   'Timezone': ['US/Pacific', 'US/Eastern']})

# parse strings to UTC first:
df['UTCtime'] = pd.to_datetime(df['UTCtime'], utc=True)

# create a dummy column to avoid key error:
df['LOCtime'] = False

# loop unique time zones and fill local time column:
for tz in df['Timezone'].unique():
    df['LOCtime'].loc[df['Timezone']==tz] = df['UTCtime'].loc[df['Timezone']==tz].dt.tz_convert(tz)
给你例如

df
                    UTCtime    Timezone                    LOCtime
0 2020-03-01 12:00:00+00:00  US/Pacific  2020-03-01 04:00:00-08:00
1 2020-07-01 12:00:00+00:00  US/Eastern  2020-07-01 08:00:00-04:00

另一个选项可能是使用
.apply
lambda
。这是一个很好的单行程序,但我猜这不是很有效:

df['LOCtime'] = df.apply(lambda r: r['UTCtime'].tz_convert(r['Timezone']), axis=1)

因为你只有4个时区,你应该可以循环这些时区。您可以使用
.loc
选择相应的行并进行本地化。例:

import pandas as pd
# example df:
df = pd.DataFrame({'UTCtime': ['2020-03-01T12:00:00', '2020-07-01T12:00:00'],
                   'Timezone': ['US/Pacific', 'US/Eastern']})

# parse strings to UTC first:
df['UTCtime'] = pd.to_datetime(df['UTCtime'], utc=True)

# create a dummy column to avoid key error:
df['LOCtime'] = False

# loop unique time zones and fill local time column:
for tz in df['Timezone'].unique():
    df['LOCtime'].loc[df['Timezone']==tz] = df['UTCtime'].loc[df['Timezone']==tz].dt.tz_convert(tz)
给你例如

df
                    UTCtime    Timezone                    LOCtime
0 2020-03-01 12:00:00+00:00  US/Pacific  2020-03-01 04:00:00-08:00
1 2020-07-01 12:00:00+00:00  US/Eastern  2020-07-01 08:00:00-04:00

另一个选项可能是使用
.apply
lambda
。这是一个很好的单行程序,但我猜这不是很有效:

df['LOCtime'] = df.apply(lambda r: r['UTCtime'].tz_convert(r['Timezone']), axis=1)

你能提供一份详细的报告吗?每个时间戳的时区是否不同?只是想知道是否可以通过删除str()函数来解决错误。当然,一个可复制的例子会有所帮助。时区分为四个美国时区,用字符串表示,如“America/Chicago”。str()不会改变任何东西,当我对一行数据执行此操作时,函数会工作。问题似乎在于“应用”。是否有可以基于两列数据运行函数的替代方案可供应用?您能否提供一个?每个时间戳的时区是否不同?只是想知道是否可以通过删除str()函数来解决错误。当然,一个可复制的例子会有所帮助。时区分为四个美国时区,用字符串表示,如“America/Chicago”。str()不会改变任何东西,当我对一行数据执行此操作时,函数会工作。问题似乎在于“应用”。是否有其他方法可以基于两列数据运行函数?上述代码仅在您将tz_转换为tz时运行_localize@chez:这意味着您的输入未本地化(UTC)-请检查我的示例,我已经本地化为UTC;之后,您需要使用
tz_convert
(熊猫1.0.5)。嗯,我使用了,它仍然告诉我。哪个代码将输入本地化?@chez:pd.to_datetime(df['UTCtime',utc=True)中的
utc=True
。但是,您可以不这样做,并且按照您所说的本地化,因为pandas默认将naive datetime视为UTC。但一定要测试一下,它是有效的,谢谢。不过我确实得到了复制警告的设置。而且它在时间上有问题,上面的代码只在您将tz_转换为tz时运行_localize@chez:这意味着您的输入未本地化(UTC)-请检查我的示例,我已经本地化为UTC;之后,您需要使用
tz_convert
(熊猫1.0.5)。嗯,我使用了,它仍然告诉我。哪个代码将输入本地化?@chez:pd.to_datetime(df['UTCtime',utc=True)中的
utc=True
。但是,您可以不这样做,并且按照您所说的本地化,因为pandas默认将naive datetime视为UTC。但一定要测试一下,它是有效的,谢谢。不过我确实得到了复制警告的设置。而且它在不确定的时间里遇到了麻烦