Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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
Pandas 现在使用时区填充datetime列_Pandas_Datetime_Python 3.6 - Fatal编程技术网

Pandas 现在使用时区填充datetime列

Pandas 现在使用时区填充datetime列,pandas,datetime,python-3.6,Pandas,Datetime,Python 3.6,我有一个带有None值的pandas datetime列,我想在特定时区中填充datetime.now() 这是我的MWE数据帧: df = pd.DataFrame([ {'end': "2017-07-01 12:00:00"}, {'end': "2017-07-02 18:13:00"}, {'end': None}, {'end': "2017-07-04 10:45:00"} ]) 如果我填写fillna: pd.to_datetime(df['en

我有一个带有
None
值的pandas datetime列,我想在特定时区中填充
datetime.now()

这是我的MWE数据帧:

df = pd.DataFrame([
    {'end': "2017-07-01 12:00:00"},
    {'end': "2017-07-02 18:13:00"},
    {'end': None},
    {'end': "2017-07-04 10:45:00"}
])
如果我填写
fillna

pd.to_datetime(df['end']).fillna(datetime.now())
df['end'] = pd.to_datetime(df['end'])
df['end'] = df['end'].fillna(pd.to_datetime(pd.datetime.now(pytz.timezone('US/Pacific'))))
print (df)
                                end
0               2017-07-01 12:00:00
1               2017-07-02 18:13:00
2  2017-07-04 03:35:08.499418-07:00
3               2017-07-04 10:45:00

print (df['end'].apply(type))
0    <class 'pandas._libs.tslib.Timestamp'>
1    <class 'pandas._libs.tslib.Timestamp'>
2    <class 'pandas._libs.tslib.Timestamp'>
3    <class 'pandas._libs.tslib.Timestamp'>
Name: end, dtype: object
结果是一个具有预期数据类型的系列:
datetime64[ns]
。但当我指定时区时,例如:

pd.to_datetime(df['end']).fillna(
    datetime.now(pytz.timezone('US/Pacific')))

这将返回一个数据类型为的序列:
object
您似乎需要在
fillna
中将
date
转换为

pd.to_datetime(df['end']).fillna(datetime.now())
df['end'] = pd.to_datetime(df['end'])
df['end'] = df['end'].fillna(pd.to_datetime(pd.datetime.now(pytz.timezone('US/Pacific'))))
print (df)
                                end
0               2017-07-01 12:00:00
1               2017-07-02 18:13:00
2  2017-07-04 03:35:08.499418-07:00
3               2017-07-04 10:45:00

print (df['end'].apply(type))
0    <class 'pandas._libs.tslib.Timestamp'>
1    <class 'pandas._libs.tslib.Timestamp'>
2    <class 'pandas._libs.tslib.Timestamp'>
3    <class 'pandas._libs.tslib.Timestamp'>
Name: end, dtype: object
我认为解决方案是将参数
utc
传递给:

utc:布尔值,默认为无

如果为True,则返回UTC DatetimeIndex(同时转换任何tz感知的datetime.datetime对象)


什么是期望输出?列中是否需要混合时区?utc with
US/Pacific
?请注意,这样做会将所有时间戳转换为该时区,最终结果是正确的,如果您查看任何特定元素值,它是带有所需时区信息的时间戳。只是numpy没有支持此功能的数据类型,但是数据类型是timestamp,并且支持数字操作。这会立即返回UTC,而不是在指定的时区中。若需要datetime64,那个么若一些日期包含时区,而另一个日期不包含时区,那个么使用datetime64数据类型是一个问题。如果所有日期都有时区或者没有时区信息,它就可以很好地工作。此外,我发现这一点-
警告:直接将时区传递给datetime.datetime构造函数是不正确的(例如,datetime.datetime(2011,1,1,tz=timezone('US/Eastern'))。相反,需要使用时区上的本地化方法对日期时间进行本地化。
谢谢!通过使用时区定义
to_datetime
解决:
df['end']=pd.to_datetime(df['end'])。dt.tz_本地化('US/Pacific')
。fillna
Supeeer,我将其添加到答案中。
df['end'] = pd.to_datetime(df['end']).dt.tz_localize('US/Pacific')
df['end'] = df['end'].fillna(pd.datetime.now(pytz.timezone('US/Pacific')))

print (df.end.dtype)
datetime64[ns, US/Pacific]