2017-05-16 3 views
1

Was wäre der beste Weg, um eine Spalte der UTC-Zeit in die lokalisierte Zeit zu konvertieren, vorausgesetzt, ich habe eine Spalte mit Länderinitialen?UTC nach lokalisierter Zeit Länderinitialen

zB

UTC   Country 
---------- | -------- 
1480597215  FR 
1480544735  RU 

zu

UTC   Country  Localized time (example) 
---------- | -------- --------------- 
1480597215  FR  datetime.datetime(2016, 12, 2, 0, 0, 15, tzinfo = FR) 
1480544735  RU 

ich es verstehen sind Zeitzone Fragen (zB Verschiedene Teile von US ist auf verschiedenen Zeitzonen), aber eine ungefähre Zuordnung der Annahme (zB alle US folgt Zentralzeit)

Was wäre der beste Ansatz dafür? Die pytz-Bibliothek benötigt aktuelle Zeitzonen (zB 'Asien/Malaysia'), aber ich habe nur die Ländercodes.

Vielen Dank! :)

+0

... "die ganze USA folgt der zentralen Zeit" ... Die Hawaiianer werden das nicht sehr schätzen. ;) –

Antwort

2

können Sie vektorisiert verwenden to_datetime + tz_localize für UTC Datetime und dann apply für Zeitzonen zu konvertieren:

from pytz import country_timezones 

df['date'] = pd.to_datetime(df['UTC'], unit='s').dt.tz_localize('UTC') 
df['tz']=df.apply(lambda x: x['date'].tz_convert(country_timezones(x['Country'])[0]), axis=1) 
print (df) 
      UTC Country      date       tz 
0 1480597215  FR 2016-12-01 13:00:15+00:00 2016-12-01 14:00:15+01:00 
1 1480544735  RU 2016-11-30 22:25:35+00:00 2016-12-01 00:25:35+02:00 

Erstellen Maske mit notnull und dann Lösung gelten nur für Werte, bei denen True s:

df = pd.DataFrame({'UTC': [1480597215, 1480597215, 1480597215, 1480544735], 
        'Country': ['', np.nan, 'FR', 'RU']}) 
print (df) 
    Country   UTC 
0   1480597215 
1  NaN 1480597215 
2  FR 1480597215 
3  RU 1480544735 

df['UTC'] = pd.to_datetime(df['UTC'], unit='s', errors='coerce').dt.tz_localize('UTC') 
mask = df['Country'].notnull() & (df['Country'] != '') 
print (mask) 
0 False 
1 False 
2  True 
3  True 
Name: Country, dtype: bool 

df['tz'] = df[mask].apply(lambda x: x['UTC'].tz_convert(country_timezones(x['Country'])[0]), 
          axis=1) 
print (df) 
    Country      UTC       tz 
0   2016-12-01 13:00:15+00:00      NaN 
1  NaN 2016-12-01 13:00:15+00:00      NaN 
2  FR 2016-12-01 13:00:15+00:00 2016-12-01 14:00:15+01:00 
3  RU 2016-11-30 22:25:35+00:00 2016-12-01 00:25:35+02:00 
+0

Hey danke! :) Es stürzt für bestimmte fehlende Werte obwohl, ich kann nicht scheinen, es zu korrigieren, um zu vermeiden, fehlende Werte ist es etwas wie folgt? df ['q'] = df.apply (Lambda x: x ['ts_listen']. Tz_convert (country_timezones (x ['land']) [0]) if (nicht pd.isnull (x) und x! = '') else 'NA', axis = 1) – Wboy

+0

Ich denke besser ist 'df [' UTC '] = pd.to_datetime (df [' UTC '], Einheit =' s ', errors =' coerce ') .dt.tz_localize ('UTC') '. Wie funktioniert es? – jezrael

+0

Oder fehlende Werte sind in 'Country' Spalte auch? – jezrael

1

können Sie country_timezones von pytz verwenden:

import pytz 
from datetime import datetime 

timestamp = 1480597215 
d = datetime.fromtimestamp(timestamp, pytz.timezone(pytz.country_timezones('fr')[0])) 
print d 

im Auge behalten, dass eine Liste der verfügbaren Zeitzone in Bezug auf Eingangs pytz.country_timezones zurückgibt.

+0

Danke !!! :) – Wboy