NSDate (или Date in Swift 3) не имеет часового пояса. Он записывает мгновение во времени по всему миру.
Внутренне, объекты даты записывают количество секунд со времени «даты эпохи» или «Полночь» 1 января 2001 года в по времени по Гринвичу , aka UTC.
Обычно мы думаем о датах в нашем локальном часовом поясе.
Если вы регистрируете дату, используя
print(NSDate())
Отображается система текущую дату, но она выражает это в UTC / Greenwich Mean Time. Таким образом, единственное место, где время будет выглядеть правильно, - это тот часовой пояс.
Вы получаете ту же проблему в отладчике, если вы выдаете команду отладчика
e NSDate()
Это боль , Я лично хотел бы, чтобы iOS / Mac OS отображали даты с использованием текущего часового пояса пользователя, но они этого не делают.
Улучшение моего предыдущего использования локализованной строки что делает его немного проще в использовании - создать расширение для класса Date
:
extension Date {
func localString(dateStyle: DateFormatter.Style = .medium, timeStyle: DateFormatter.Style = .medium) -> String {
return DateFormatter.localizedString(from: self, dateStyle: dateStyle, timeStyle: timeStyle)
}
}
Таким образом, вы можете просто использовать выражение типа Date().localString()
или хотите только распечатать время, вы можете использовать Date().localString(dateStyle:.none)
Я только что обнаружил, что NSDateFormatter
(DateFormatter
в Swift 3) имеет метод класса localizedString. Это делает то, что делает мое расширение ниже, но более просто и чисто. Вот объявление:
class func localizedString(from date: Date, dateStyle dstyle: DateFormatter.Style, timeStyle tstyle: DateFormatter.Style) -> String
Итак, вы просто используете
let now = Date()
print (DateFormatter.localizedString(
from: now,
dateStyle: .short,
timeStyle: .short))
. Вы можете в значительной степени игнорировать все ниже.
I создали категорию класса NSDate (Date in swift 3), которая имеет метод localDateString, который отображает дату в локальном часовом поясе пользователя.
Вот категория в форме Swift 3: (filename Date_displayString. swift)
extension Date {
@nonobjc static var localFormatter: DateFormatter = {
let dateStringFormatter = DateFormatter()
dateStringFormatter.dateStyle = .medium
dateStringFormatter.timeStyle = .medium
return dateStringFormatter
}()
func localDateString() -> String
{
return Date.localFormatter.string(from: self)
}
}
И в форме Swift 2:
extension NSDate {
@nonobjc static var localFormatter: NSDateFormatter = {
let dateStringFormatter = NSDateFormatter()
dateStringFormatter.dateStyle = .MediumStyle
dateStringFormatter.timeStyle = .MediumStyle
return dateStringFormatter
}()
public func localDateString() -> String
{
return NSDate.localFormatter.stringFromDate(self)
}
}
(Если вы предпочитаете другой формат даты, довольно легко изменить формат, используемый форматом даты.
Я бы предложил разместить соответствующую версию этого файла Swift 2 / Swift 3 во всех ваших проектах.
Затем вы можете использовать
Swift 2:
print(NSDate().localDateString())
Swift 3:
print(Date().localDateString())
Да, с помощью set_index вы можете сделать Locality
ваш индекс строки.
data.set_index('Locality', inplace=True)
Если inplace=True
не указана, set_index
возвращает измененный файл данных как результат.
Пример:
> import pandas as pd
> df = pd.DataFrame([['ABBOTSFORD', 427000, 448000],
['ABERFELDIE', 534000, 600000]],
columns=['Locality', 2005, 2006])
> df
Locality 2005 2006
0 ABBOTSFORD 427000 448000
1 ABERFELDIE 534000 600000
> df.set_index('Locality', inplace=True)
> df
2005 2006
Locality
ABBOTSFORD 427000 448000
ABERFELDIE 534000 600000
> df.loc['ABBOTSFORD']
2005 427000
2006 448000
Name: ABBOTSFORD, dtype: int64
> df.loc['ABBOTSFORD'][2005]
427000
> df.loc['ABBOTSFORD'].values
array([427000, 448000])
> df.loc['ABBOTSFORD'].tolist()
[427000, 448000]
Вы можете изменить индекс, как описано уже с помощью set_index
. Вам не нужно вручную менять строки с помощью столбцов, в pandas есть метод transpose (data.T
), который делает это для вас:
> df = pd.DataFrame([['ABBOTSFORD', 427000, 448000],
['ABERFELDIE', 534000, 600000]],
columns=['Locality', 2005, 2006])
> newdf = df.set_index('Locality').T
> newdf
Locality ABBOTSFORD ABERFELDIE
2005 427000 534000
2006 448000 600000
, после чего вы можете получить значения столбца dataframe и преобразовать их в список:
> newdf['ABBOTSFORD'].values.tolist()
[427000, 448000]